シェルの起動が遅い原因は anyenv だった・・・よろしい、ならば高速化だ

開けましておめでとうございます。
2021年になりました。昨年はコロナ禍で大きな変化の年となりましたが・・・今年も色々と変わっていくのでしょう。

年も明けたし、bashを鍛え直すかということで bashrc を整理していたのですが・・・
最近どうも起動が遅く、よくよく調べると anyenv が遅かったので、それを高速化する話です。

anyenv 便利・・・!だけど、 init がめっちゃ重い

言語をいくつか使ってると、pyenv 等のなんとか env を使うことがよくあります。
それぞれインストールするのは以外と面倒だったりします・・・。

anyenv を使うと、これら env 系のインストールが非常に楽になるため、私は好んで anyenv を使ってます。

ちなみに、anyenv は

eval "$(anyenv init -)"

と bashrc 等に記載することで使えます。

しかし・・・インストールする env 数が多くなると、目に見えてシェルの起動が遅くなっていきます。
IOが早い環境でも0.5秒程度・・・IOが遅い環境だと、1~2秒掛かったりします。
tmux を使っていたり、頻繁にシェルを開く状況だと、この微妙な遅さがすごく気になります。

高速化(その1)

init の度に毎回全てのenvでrehash (実行ファイルへの shimsを作成する処理)を実行しており、これが8割方占めていました。
ファイルを列挙して比較して不足分の shims を作成する・・・という処理なので重いのも当然です。

eval "$(anyenv init - --no-rehash)"

このように、anyenv init – の結果から、rehash を取り除くことで、かなりの高速化が出来ます。
注意点として、各env で新たに実行ファイルが増えた際は rehash を明示的に呼ぶ必要があります。

他にも –no-completion を指定すると、bash-completion の定義ファイルを読みに行かなくなるので、多少は高速化します。
自宅の環境だと誤差のレベルだったので、つけていません。

高速化(その2)

高速化(その1) でほぼほぼ早くなるのですが・・・それでもワンテンポ遅いです。
目指すはデフォルトのbash並の軽さ、小気味よさです。

anyenv init – でeval するシェルスクリプトが吐かれるワケですが・・・これも結局インストールされた env をチェックして、それに応じた処理を入れてるわけなので、多少なりとも重いわけです。このinitコードが変わることって、新しいenvを入れたときか、anyenv 自身の仕様が変わったときくらいです。正直、動的にする必要性もないかと思います。

というわけで、

anyenv init - --no-rehash > ~/.anyenv-rc.sh

で、ファイルに吐き出しておいて、.bashrc 等で、

if [ -f ~/.anyenv-rc.sh ]; then
    source ~/.anyenv-rc.sh
fi

と追記してあげると・・・めっちゃ高速化します(自宅環境では、素の bash 並に)

さいごに

二つの方法で高速化することで、瞬間で bash が起動するようになりました。
最高です!

コメント

タイトルとURLをコピーしました