zshの起動が遅いと以前から思っていて、我慢できなくなったので調査した。
参考にした記事。
ref: https://qiita.com/vintersnow/items/7343b9bf60ea468a4180
まずは現状の計測。
$ time ( zsh -i -c exit )
num calls time self name
-----------------------------------------------------------------------------------
num calls time self name
-----------------------------------------------------------------------------------
1) 1 21.03 21.03 96.47% 21.03 21.03 96.47% compinit
2) 6 0.42 0.07 1.92% 0.42 0.07 1.92% compdef
3) 5 0.66 0.13 3.01% 0.30 0.06 1.39% complete
4) 2 0.05 0.02 0.23% 0.05 0.02 0.23% bashcompinit
-----------------------------------------------------------------------------------
1) 1 21.03 21.03 96.47% 21.03 21.03 96.47% compinit
-----------------------------------------------------------------------------------
3) 5 0.66 0.13 3.01% 0.30 0.06 1.39% complete
5/6 0.35 0.07 1.63% 0.35 0.07 compdef [2]
-----------------------------------------------------------------------------------
5/6 0.35 0.07 1.63% 0.35 0.07 complete [3]
2) 6 0.42 0.07 1.92% 0.42 0.07 1.92% compdef
-----------------------------------------------------------------------------------
4) 2 0.05 0.02 0.23% 0.05 0.02 0.23% bashcompinit
( zsh -i -c exit; ) 2.05s user 2.03s system 99% cpu 4.105 total
4秒くらいかかる。
compinit
が遅いというのが明確にわかったのでとりあえずその辺を見てみる。
.zshrc
を見てみる
fpath=($(brew --prefix)/share/zsh/site-functions $fpath)
fpath=(/usr/local/share/zsh-completions $fpath)
fpath=($(brew --prefix asdf)/etc/bash_completion.d $fpath)
autoload -Uz compinit
compinit -C
fpathをコメントアウトしながら計測していくと、どうも1行目と3行目で時間がかかっているようだった。
brew --prefix
を利用してるという共通点。
$ time (brew --prefix)
/usr/local
( brew --prefix; ) 0.66s user 0.62s system 99% cpu 1.289 total
$ time (brew --prefix asdf)
/usr/local/opt/asdf
( brew --prefix asdf; ) 0.63s user 0.61s system 100% cpu 1.228 total
すごく遅い。
fpath以外の部分も含めてbrew --prefix
を利用しないように修正して再計測。
fpath=(/usr/local/share/zsh/site-functions $fpath)
fpath=(/usr/local/share/zsh-completions $fpath)
fpath=(/usr/local/opt/asdf/etc/bash_completion.d $fpath)
autoload -Uz compinit
compinit -C
$ time ( zsh -i -c exit )
num calls time self name
-----------------------------------------------------------------------------------
num calls time self name
-----------------------------------------------------------------------------------
1) 1 40.26 40.26 98.15% 40.26 40.26 98.15% compinit
2) 6 0.41 0.07 0.99% 0.41 0.07 0.99% compdef
3) 5 0.64 0.13 1.56% 0.30 0.06 0.72% complete
4) 2 0.05 0.03 0.13% 0.05 0.03 0.13% bashcompinit
-----------------------------------------------------------------------------------
1) 1 40.26 40.26 98.15% 40.26 40.26 98.15% compinit
-----------------------------------------------------------------------------------
3) 5 0.64 0.13 1.56% 0.30 0.06 0.72% complete
5/6 0.34 0.07 0.84% 0.34 0.07 compdef [2]
-----------------------------------------------------------------------------------
5/6 0.34 0.07 0.84% 0.34 0.07 complete [3]
2) 6 0.41 0.07 0.99% 0.41 0.07 0.99% compdef
-----------------------------------------------------------------------------------
4) 2 0.05 0.03 0.13% 0.05 0.03 0.13% bashcompinit
( zsh -i -c exit; ) 0.15s user 0.16s system 93% cpu 0.328 total
とても早くなった :)