zpluginの遅延ロード使ってzshの起動を早くする


zshのプラグイン管理としてzplugを使ってたが、起動が遅くてtmuxとかで複数起動しようとするとき特にストレスになってた。
zpluginにすると速くなるという記事も多く見かけたので、zplugからzpluginへの移行をやってみた。
zpluginの遅延ロードを使って、プラグインのロードをzsh起動後に行うようにした。(zplugの遅延ロード等も試したが、やり方が悪かったのかあまり速度改善しなかった)

# 以前(zplug使用)のzsh起動時間
## 計測
これで計測

```shell:.zshrc
export ZFILES=~/.zfiles
export ZPLUG_HOME=~/.zplug
start=`date +%S%3N`
source $ZFILES/.zplugin
end=`date +%S%3N`
echo "plugin load $((end - start))ms"
```

```shell:.zplugin
zplug "mafredri/zsh-async"
zplug "zsh-users/zsh-history-substring-search"
zplug "zsh-users/zsh-syntax-highlighting"
.
.
.
```

## 結果
プラグインのロードが支配的で、2~3秒かかっていた...

```
plugin load 2470ms 
else 276ms
kefi@asuka %
```

zprofでみたところ、zplug関連がなんかすごそうだった
参考: https://qiita.com/vintersnow/items/7343b9bf60ea468a4180

```
num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)    1         387.84   387.84   15.34%    364.40   364.40   14.41%  __zplug::log::write::info
 2)    8         369.51    46.19   14.61%    351.74    43.97   13.91%  __zplug::core::sources::call
 3)    1         505.78   505.78   20.00%    251.92   251.92    9.96%  __check__
 4)    8         242.87    30.36    9.60%    242.87    30.36    9.60%  __zplug::sources::github::check
 5)    4         413.29   103.32   16.35%    208.18    52.05    8.23%  compinit
 6)    1         492.94   492.94   19.49%    205.19   205.19    8.11%  __zplug::core::core::prepare
 7)    6         205.11    34.19    8.11%    205.11    34.19    8.11%  compaudit
 8)    8         488.98    61.12   19.34%    119.47    14.93    4.72%  __zplug::core::sources::use_default
 9)    8         591.83    73.98   23.41%    102.33    12.79    4.05%  __zplug::core::add::to_zplugs
10)    1          98.63    98.63    3.90%     98.63    98.63    3.90%  __zplug::utils::awk::available
11)    1          75.87    75.87    3.00%     75.87    75.87    3.00%  __zplug::core::cache::diff
12)    3          88.06    29.35    3.48%     66.04    22.01    2.61%  __zplug::core::core::get_interfaces
13)    1          45.81    45.81    1.81%     44.98    44.98    1.78%  __zplug::base::base::git_version
14)    1          23.44    23.44    0.93%     23.44    23.44    0.93%  __zplug::job::handle::flock
15)   30          22.01     0.73    0.87%     22.01     0.73    0.87%  regexp-replace
16)    7          66.28     9.47    2.62%     18.58     2.65    0.73%  __zplug::base
17)    2          18.12     9.06    0.72%     18.12     9.06    0.72%  promptinit
```


# zpluginを使う
https://github.com/zdharma/zplugin
参考: https://qiita.com/Jung0/items/bec15a0285a02d5761d4

## install
推奨手順でinstall 
https://github.com/zdharma/zplugin#option-1---automatic-installation-recommended

```
sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zplugin/master/doc/install.sh)"
```

## zshrcを書き換え

```diff:.zshrc
 export ZFILES=~/.zfiles
-export ZPLUG_HOME=~/.zplug
+
 start=`date +%S%3N`
+source ~/.zplugin/bin/zplugin.zsh
+autoload -Uz _zplugin
+(( ${+_comps} )) && _comps[zplugin]=_zplugin
 source $ZFILES/.zplugin
 end=`date +%S%3N`
 echo "plugin load $((end - start))ms"
```

```diff:.zplugin
-zplug "mafredri/zsh-async"
-zplug "zsh-users/zsh-history-substring-search"
-zplug "zsh-users/zsh-syntax-highlighting"
+zplugin load mafredri/zsh-async
+zplugin ice wait'!3'; zplugin load zsh-users/zsh-history-substring-search
+zplugin ice wait'!3'; zplugin load zsh-users/zsh-syntax-highlighting
+
+ zcompile ~/.zplugin/bin/zplugin.zsh
```

waitを使って遅延ロードにできるらしい

# zplugin変更後の起動時間

初回起動

```
plugin load 245ms 
else 296ms
```

2回目起動

```
plugin load 114ms 
else 211ms
```

* 2回目以降は100ms強、初回起動でも200~300msで起動した
* 今回は遅延ロードとして、3秒待って各プラグインのロードを開始しているため、3秒後くらいからいろんな機能が使えるようになっている

# 所感
* これまで起動(シェルを操作できるようになるまで)に2秒以上時間がかかっていてストレスだったが、大幅に起動時間が短縮されてとても良い
* 遅延ロードの設定も書きやすそう(まだちゃんと見てないのでもっといろいろできるんだろう)