ゆるい技術メモ

記事一覧 / シェル

zsh の起動時間を切り分けて調べる

手順メモ · 一般的な例 · 実行環境依存

通常の起動と設定を省いた起動を比較し、zprof で関数の処理時間を確認する手順。

まず同じ条件で測る

起動の待ち時間を調べるときは、設定を変更する前の記録を残します。以下は計測方法の例です。このサイトで特定の端末を実測した結果や、短縮できる時間を示すものではありません。

zsh --version
for i in 1 2 3 4 5; do
  /usr/bin/time zsh -i -c exit
done

同じターミナル、同じ作業ディレクトリで数回繰り返し、経過時間のばらつきを見ます。time の表示形式は OS によって異なります。バックグラウンド処理やキャッシュも値に影響するため、一回の最小値だけで比較しません。

設定の影響を比べる

for i in 1 2 3 4 5; do
  /usr/bin/time zsh -f -i -c exit
done

-i は対話シェル、-c は実行するコマンドを指定します。-f は通常の起動設定の読み込みを抑えますが、システムの /etc/zshenv まで完全に省くわけではありません。差が大きければ、設定や読み込む機能を調べる手掛かりになります。

ログインシェルでだけ遅い場合は、比較する両方の条件に -l を付けて、ログイン時の起動ファイルも含めます。通常起動と異なる条件の数値を、同じものとして扱わないようにします。

zprof で関数の内訳を見る

編集前の設定を別名で保存し、開いている正常なシェルも残します。調査中だけ、対象の .zshrc の先頭に次を追加します。

zmodload zsh/zprof

同じファイルの末尾には次を追加し、新しいシェルで出力を確認します。

zprof

zprof が集計するのは主にシェル関数です。外部コマンドやファイル全体のすべての待ち時間を、そのまま一行ずつ説明するものではありません。プロファイラ自体の影響もあるため、関数の内訳と全体の起動時間は別々に見ます。

変更は一つずつ戻せる形で

補完初期化、プラグイン、言語環境の初期化などを一つずつ調べます。必要な処理を無条件で削除するのではなく、使う場面と読み込み順を確認します。

調査が終わったら zprof 用の二行を外して再計測し、補完やコマンド検索など普段の操作も確かめます。数値の記録には OS、zsh のバージョン、測定条件を添えると比較しやすくなります。

参考にした公式資料