68
71

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-02-01

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

余談:タイトルについて

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

参考

68
71
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
71

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?