Help us understand the problem. What is going on with this article?

【zsh高速化】え~、そんなプラグインマネージャーがあるんだったらもっと早く教えてよ、と姉が怒り出した - Zinit (旧名Zplugin)

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内のzpluginzinitに変更する

はじめに

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のお世話になっております。

ちなみに、まっさらな状態のzshの起動は爆速です。

( zsh -i -c exit; )  0.00s user 0.00s system 79% cpu 0.011 total

遅い原因を探る

まず、.zshenvの先頭に以下を追記します。

.zshenv
zmodload zsh/zprof && zprof

次に、.zshrcの最後尾に以下を追記。

.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を書き換えます。

.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プラグインを読み込むことになります。

.zshrc
zinit ice wait'0'; zinit load hoge/hoge # プラグイン読み込み

起動時に必要なプラグインでなければ、遅延読み込みしてもさしたる問題はないでしょう。すなわち、この0秒遅延読み込みにより起動がさらに高速化されます。

筆者は2つのプラグインを遅延読み込みしています。

.zshrc
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より速いプラグインマネージャーをご存知ならぜひ教えてください。

余談:タイトルについて

このキャッチーなタイトルはコピーメカで自動生成しました。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした