Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

eval "$(hoge init)"するツールをたくさん入れてるシェルの起動速度をちょっと良くする

皆さんのシェルの起動速度はどうですか?シェル起動時に eval "$(hoge init)" を実行するようなツールをたくさん入れていると徐々に遅くなってきてつらいですよね

そこで以下のように hoge init の出力をファイルに書き出しておいて、起動時にはそれをsourceする戦略をとると少しだけシェルの起動を高速化できて少しだけ嬉しいです。

# zshでの例
HOGE_RC_FILE=/path/to/hoge-rc.zsh
[[ ! -e "$HOGE_RC_FILE" ]] && hoge init > "$HOGE_RC_FILE"

source "$HOGE_RC_FILE"

plenv,goenv,nodenv,pyenvを管理しているanyenvでのベンチマークを以下に貼っておきます。

# source/zshrc
ANYENV_RC_FILE=./anyenv-rc.zsh
[[ ! -e "$ANYENV_RC_FILE" ]] && anyenv init - > "$ANYENV_RC_FILE"

source "$ANYENV_RC_FILE"
# eval/zshrc
eval "$(anyenv init -)"
$ hyperfine --shell=zsh --warmup=3 'source $PWD/eval/zshrc' 'source $PWD/source/zshrc'
Benchmark 1: source $PWD/eval/zshrc
  Time (mean ± σ):      1.288 s ±  0.010 s    [User: 0.487 s, System: 0.727 s]
  Range (min … max):    1.278 s …  1.314 s    10 runs

Benchmark 2: source $PWD/source/zshrc
  Time (mean ± σ):     452.8 ms ±   5.7 ms    [User: 189.2 ms, System: 240.1 ms]
  Range (min … max):   446.9 ms … 467.1 ms    10 runs

Summary
  'source $PWD/source/zshrc' ran
    2.85 ± 0.04 times faster than 'source $PWD/eval/zshrc'

この戦略で少し困ることとしては、ツールの更新があるたびにhoge init > $HOGE_RC_FILE相当のコマンドを良きタイミングで実行する必要があることですね。