Naoto Ishizawa/zshの起動を高速化した

Created Tue, 20 Jul 2021 11:00:00 +0900 Modified Sat, 17 Dec 2022 21:58:21 +0000
546 Words

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

とても早くなった :)