概要
fish shellの起動がだんだん遅くなってきたので、設定ファイルの棚卸しも兼ねて起動時のプロファイルを取得して遅い部分を調査しました。
プロファイルの取得
一般にfish shellでプロファイルを取得するには、fish
の起動時に--profile /path/to/file.txt
というオプションを指定します。
$ fish --profile profile.txt
これで新しくfish shellが立ち上がり、シェルを終了するまでの実行されたコマンドとその処理時間が詳細に記録されます。
例えば、ls
を実行すると以下のような結果が出てきます。なお、ここに示している出力以外にも大量にコマンドが前後に出てきますが、ここでは割愛しています。
Time Sum Command
[...]
436 31113 > ls
401 14172 -> source /usr/local/Cellar/fish/2.7.1/share/fish/functions/ls.fish
36 13771 --> if command ls --version >/dev/null ^/dev/null...
5557 5557 ---> command ls --version >/dev/null ^/dev/null
8149 8149 ---> command ls -G / >/dev/null ^/dev/null
29 29 ---> function ls --description "List contents of directory"...
16505 16505 -> command ls -G $argv
[...]
1カラム目のTimeが各行のコマンド単体の実行にかかった時間、2カラム目のSumがコマンド全体としてかかった時間、そして3カラム目が実行されたコマンドを示しています。時間の単位はどちらもマイクロ秒です。
ls
が実行されるとまずls.fish
というコマンドが読み込まれ、この処理自体は14.172msかかっていることがわかります。コマンドの中身を見ると"Make ls use colors if we are on a system that supports that feature and writing to stdout."とあるので、lsのファイル名などに色を付ける関係の処理を行っているようです。
起動時プロファイルを取得する
今回は起動時間が遅いということで、シェルの立ち上げ時のプロファイルを取得します。--profile
をつけてシェルを起動してすぐに終了させることで起動部分のみのプロファイルを取得します。そして2カラム目のトータル実行時間でソートすることで、コマンドの処理時間順に並び替えています。
$ fish --profile profile.txt
$ exit
$ sort -k 2 -nr profile.txt
これでボトルネックとなっている箇所が特定できます。私の場合はfishermanで入れた特定のパッケージの設定が遅いことがわかったので、それを.config/fish/config.fish
上で無効にすることにより、起動時間を短縮することができました。