開けましておめでとうございます。
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 が起動するようになりました。
最高です!
コメント