TL;DR
- zplugから
ZpluginZinitへ
2020.03.06追記
2020.01.19に、ZpluginはZinitという名称へ変更されたようです。
名称変更に伴い、本記事の内容もZinit用に変更しました。
- 19-01-2020
- The name has been changed to Zinit based on the results of the poll.
(zdharma/zinitより)
とはいえ、元々のZpluginユーザーがするべきことは特にありません。
もしZinitに移行するなら、行うべき変更は2つだけです。
- Zinitをインストールする
- .zshrc内の
zplugin
をzinit
に変更する
はじめに
zshの起動高速化を試みました。
zplugからZpluginZinitに乗り換えただけで、起動時間を約1.5秒から約0.4秒まで短縮できました。
なお、起動時間は以下のコマンドで計測しました。参考値程度に考えてください。
$ time ( zsh -i -c exit )
まずは現状
もとのzshの起動時間は約1.5秒でした。(設定ファイルはzcompile済み)
( zsh -i -c exit; ) 1.04s user 0.40s system 94% cpu 1.519 total
( zsh -i -c exit; ) 1.00s user 0.39s system 94% cpu 1.462 total
( zsh -i -c exit; ) 1.02s user 0.40s system 94% cpu 1.502 total
使用しているプラグインは以下の3つです。言わずと知れたzplugのお世話になっております。
- momo-lab/zsh-abbrev-alias:略語を展開してくれる
- zsh-users/zsh-syntax-highlighting:実行可能なコマンドに色付け
- zsh-users/zsh-completions:コマンド補完
ちなみに、まっさらな状態のzshの起動は爆速です。
( zsh -i -c exit; ) 0.00s user 0.00s system 79% cpu 0.011 total
遅い原因を探る
まず、.zshenv
の先頭に以下を追記します。
zmodload zsh/zprof && zprof
次に、.zshrc
の最後尾に以下を追記。
if (which zprof > /dev/null) ;then
zprof | less
fi
結果は以下のようになりました。ボトルネックになっているのはプラグイン関連ぽい(適当)。
num calls time self name
-----------------------------------------------------------------------------------
1) 1 254.77 254.77 44.29% 253.25 253.25 44.02% __zplug::log::write::info
2) 5 90.50 18.10 15.73% 90.50 18.10 15.73% __zplug::io::print::f
3) 2 31.36 15.68 5.45% 31.36 15.68 5.45% compaudit
4) 2 61.74 30.87 10.73% 30.39 15.19 5.28% compinit
...
ZpluginZinit
ZpluginZinitというプラグインマネージャーが速いらしいので試してみることに。(dotfilesをキレイキレイするついでに晒す - Qiita)
インストールは簡単で、以下を実行するだけです(不安な方は公式のREADMEへ)。~/.zinit/bin
にZinitがインストールされます。
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"
次に、ZpluginZinit用に.zshrc
を書き換えます。
-source ~/.zplug/init.zsh
-zplug 'momo-lab/zsh-abbrev-alias' # 略語を展開する
-zplug 'zsh-users/zsh-syntax-highlighting' # 実行可能なコマンドに色付け
-zplug 'zsh-users/zsh-completions' # 補完
-# Install check
-if ! zplug check --verbose; then
- printf 'Install? [y/N]: '
- if read -q; then
- echo; zplug install
- fi
-fi
-zplug load --verbose
+### Added by Zplugin's installer
+source "${HOME}/.zinit/bin/zinit.zsh"
+autoload -Uz _zinit
+(( ${+_comps} )) && _comps[zinit]=_zinit
+zinit load momo-lab/zsh-abbrev-alias # 略語を展開する
+zinit load zsh-users/zsh-syntax-highlighting # 実行可能なコマンドに色付け
+zinit load zsh-users/zsh-completions # 補完
結果、起動時間が約0.4秒になりました。これならほとんど起動時間が気になりません。ZpluginZinit恐るべし。
( zsh -i -c exit; ) 0.26s user 0.13s system 93% cpu 0.414 total
( zsh -i -c exit; ) 0.26s user 0.13s system 93% cpu 0.417 total
( zsh -i -c exit; ) 0.24s user 0.12s system 94% cpu 0.379 total
ZpluginZinitでさらなる高速化
遅延読み込み
ice wait
を使うことでプラグインを遅延読み込みできます。
これが非常に強力で、例えば以下のようにice wait'0'
とすると、zshが起動した後に0秒置いてhoge/hogeプラグインを読み込むことになります。
zinit ice wait'0'; zinit load hoge/hoge # プラグイン読み込み
起動時に必要なプラグインでなければ、遅延読み込みしてもさしたる問題はないでしょう。すなわち、この0秒遅延読み込みにより起動がさらに高速化されます。
筆者は2つのプラグインを遅延読み込みしています。
zinit load momo-lab/zsh-abbrev-alias # 略語を展開する
- zinit load zsh-users/zsh-syntax-highlighting # 実行可能なコマンドに色付け
- zinit load zsh-users/zsh-completions # 補完
zinit load momo-lab/zsh-abbrev-alias # 略語を展開する
+ zinit ice wait'!0'; zinit load zsh-users/zsh-syntax-highlighting # 実行可能なコマンドに色付け
+ zinit ice wait'!0'; zinit load zsh-users/zsh-completions # 補完
(wait'0'
ではなくwait'!0'
とすると、読み込み完了のメッセージが出なくなる)
遅延読み込み後の起動時間は約0.3秒となりました!ZpluginZinit恐るべし。
( zsh -i -c exit; ) 0.15s user 0.08s system 93% cpu 0.240 total
( zsh -i -c exit; ) 0.16s user 0.08s system 91% cpu 0.264 total
( zsh -i -c exit; ) 0.17s user 0.09s system 87% cpu 0.293 total
まとめ
ZpluginZinitの導入により、zshの起動時間を約1.5秒→約0.4秒→約0.3秒まで短縮できました。
もしZpluginZinitより速いプラグインマネージャーをご存知ならぜひ教えてください。
余談:タイトルについて
このキャッチーなタイトルはコピーメカで自動生成しました。