💨

zsh の起動速度を改善した

2020/10/28に公開

anyenv init をキャッシュする話です。


最近 vim-jp の Slack に入ったので眺めています。vim だけではぜんぜんなくて、幅広い雑談が豊富でおもしろいです。もちろん話題の中心は大好きな vim なので、なんというか最高ですね。

さて、vim-jp で最近一瞬だけ zsh の起動速度が話題になっていました。結構みんな速い………!普通にいまの速度で諦めていた自分を恥じました。恥ずかしい。確認してみたら… 0.5 秒近くかかっているとか…!せっかちな自分にはあるまじき状態である。

$ for i in $(seq 1 10); do time zsh -i -c exit > /dev/null ; done
zsh -i -c exit > /dev/null  0.43s user 0.45s system 94% cpu 0.935 total
zsh -i -c exit > /dev/null  0.42s user 0.43s system 96% cpu 0.884 total
zsh -i -c exit > /dev/null  0.42s user 0.44s system 96% cpu 0.892 total
zsh -i -c exit > /dev/null  0.42s user 0.43s system 95% cpu 0.881 total
zsh -i -c exit > /dev/null  0.42s user 0.43s system 96% cpu 0.879 total
zsh -i -c exit > /dev/null  0.42s user 0.43s system 96% cpu 0.881 total
zsh -i -c exit > /dev/null  0.41s user 0.44s system 96% cpu 0.879 total
zsh -i -c exit > /dev/null  0.41s user 0.43s system 96% cpu 0.877 total
zsh -i -c exit > /dev/null  0.42s user 0.45s system 96% cpu 0.898 total
zsh -i -c exit > /dev/null  0.42s user 0.44s system 96% cpu 0.901 total

とはいえあんまり大したことはやってないんだけど。どうしたもんかなとツラツラ眺めていたら、わりと anyenv のイニシャライズ処理が大半を占めていたことが判明。

こういうやつ。

if [ -x /usr/local/bin/anyenv ]
then
   eval "$(anyenv init - --no-rehash)"
   eval "$(nodenv init -)"
fi

eval する前の結果を外に書き出しといて、キャッシュするようにしてみた。さらに zcompile もかけておく。/tmp に入れとけば適度にリフレッシュしてくれるし安心かなと。こんな感じにした。

if [ -x /usr/local/bin/anyenv ]
then
   if ! [ -f /tmp/anyenv.cache ]
   then
      anyenv init - --no-rehash > /tmp/anyenv.cache
      zcompile /tmp/anyenv.cache
   fi
   source /tmp/anyenv.cache

   if ! [ -f /tmp/nodeenv.cache ]
   then
      nodenv init - > /tmp/nodeenv.cache
      zcompile /tmp/nodeenv.cache
   fi
   source /tmp/nodeenv.cache
fi

この変更をしただけで、驚いたことに倍以上の速さに!!すげえ。

$ for i in $(seq 1 10); do time zsh -i -c exit > /dev/null ; done
zsh -i -c exit > /dev/null  0.18s user 0.19s system 83% cpu 0.448 total
zsh -i -c exit > /dev/null  0.18s user 0.17s system 94% cpu 0.362 total
zsh -i -c exit > /dev/null  0.18s user 0.17s system 94% cpu 0.376 total
zsh -i -c exit > /dev/null  0.17s user 0.17s system 93% cpu 0.361 total
zsh -i -c exit > /dev/null  0.17s user 0.16s system 94% cpu 0.359 total
zsh -i -c exit > /dev/null  0.18s user 0.17s system 94% cpu 0.373 total
zsh -i -c exit > /dev/null  0.18s user 0.17s system 94% cpu 0.374 total
zsh -i -c exit > /dev/null  0.18s user 0.17s system 94% cpu 0.372 total
zsh -i -c exit > /dev/null  0.19s user 0.18s system 94% cpu 0.382 total
zsh -i -c exit > /dev/null  0.19s user 0.18s system 93% cpu 0.392 total

まとめ

今までは tmux でウィンドウ追加したときに、一拍待ってから作業を開始する仕草が身についてたんだけど、この変更をしてからはサクサクコマンドが叩けるようになった。めっちゃ違う。

まだもうちょっと速くはできそうではあるが。投資した時間に見合わなそうなので、いったんおしまい。

Discussion