fishの起動時間

by
カテゴリ:

fishの起動時間はfish -i -c "fish_prompt; exit 0"の実行時間で測るとよさそうです。

コマンドのベンチマークに便利なhyperfineを使うとこんな感じ。
平均45.8msとのことで、十分に高速かと思います。

> hyperfine -w 5 -r 50 -N 'fish -i -c "fish_prompt; exit 0"'
Benchmark 1: fish -i -c "fish_prompt; exit 0"
  Time (mean ± σ):      45.8 ms ±   2.7 ms    [User: 32.9 ms, System: 16.5 ms]
  Range (min … max):    41.6 ms …  55.2 ms    50 runs

fish_promptの呼び出しが必要そうと気付いたきっかけは、呼び出しなしでのベンチマーク結果(22.8ms)と、体感の起動速度に差があったためでした。
当時はfish_promptの最適化前だったのもあり、気付きやすかった模様。
私はプロンプトにKubernetesで利用中のContextやNamespaceを表示するようにしていますが、kubectlコマンドがどうにも遅いようですね。
kubectlの代わりにgojqで設定ファイルを読むようにして、最適化し、正味の起動時間を100msほど改善しました。

以下はfish_promptを含まない起動時間。

> hyperfine -w 5 -r 50 -N 'fish -i -c "exit 0"'
Benchmark 1: fish -i -c "exit 0"
  Time (mean ± σ):      22.8 ms ±   1.2 ms    [User: 15.5 ms, System: 8.9 ms]
  Range (min … max):    20.9 ms …  25.6 ms    50 runs

ちなみにfishの関数をベンチマークしたい場合はtime関数が便利です。
以下はfish_promptを10回実行するのにかかる時間を計測する例。

> time for i in ( seq 10); fish_prompt >/dev/null; end

________________________________________________________
Executed in  140.37 millis    fish           external
   usr time   95.23 millis   32.20 millis   63.03 millis
   sys time   49.39 millis   17.81 millis   31.58 millis

ENJOY!