bashの起動速度を5倍速にしたので褒めて

はじめに

あけましておめでとうございます。気がついたら年が明けていました。本年こそ頑張って技術ブログを更新していきたいものですね。

さてこの記事はクリスマスを迎えるためのカレンダーこと、MakeITアドベントカレンダーの25日目の記事になります。 qiita.com

え?もう1月だって?

Google先生によるとクリスマス - Wikipedia

キリスト教の中でもカトリックの影響の強いイタリア、ポーランド、フランス、スペインなどでは、クリスマスは12月25日に始まり、1月6日の公現祭(エピファニア)に終わる。クリスマスの飾り付けは23日頃に行う。24日はクリスマス・イヴとして夜を祝う。

1月6日まではクリスマスですし、片付けのこととかを考えれば今日も実質クリスマスですよね。なので今日は25日目のブログの日です。(は?)

もともとは別の人担当でしたがまだカレンダーが空いている&&面白いネタができたので変わって私が投稿します。 というわけでやっていきたいと思います。


bashの起動速度をはやくしました

該当PR:

github.com

before

{ fumihumi } (master *) (dotfiles): time source ~/.bashrc
real    0m2.709s
user    0m1.295s
sys     0m1.097s

after

{ fumihumi } (master *) (dotfiles): time source ~/.bashrc
real    0m0.481s
user    0m0.208s
sys     0m0.246s

🎉 なんとびっくり、計測誤差が多少ありますが、平均して4~5倍速に!!! 🎉

はてなって:tada:できないんですね。

そもそもどうしておそかったの

いや気がついたらストレスがたまるくらいには遅くなっていたんですよね。

普段はターミナル立ち上げてから基本的にはtmuxinatorで自動化しているレイアウトを復活させていて、その時にdockerとかを立ち上げたりしてるので生のbashを新規立ち上げたりする機会があまりなく普段使いにはあまり支障がありませんでした。

ただ、年末年始に仕事以外のプロジェクトを触ろうとするとtmuxinatorのconfigがないため手動でいろいろ立ち上げるわけですが、1度なら気にならないがなんどもbashを立ち上げるとストレスを感じるほど遅かったわけです..........

そんな悩みを友人に投げてみると

Image from Gyazo

次の記事を共有してもらいました。

zshrcの中でbrew --prefixしないほうがよい理由 - Qiita

実際にHomebrew側のISSUE等も調べてみるといまだに完全はされておらずbrew --prefixは悪手のように見えてきます。

github.com

なにしたの

そこで、一度 brew --prefixを実行したらそれを変数にいれて実行結果をキャッシュさせるという手段を取りました。

remove 'brew --prefix' command call. by fumihumi · Pull Request #21 · fumihumi/dotfiles · GitHub

brew --prefix ってPCの環境問わずにbrewのpathを出してくれるため環境構築する際のサンプルコードとしてよく出てくるきがしますが、実際にそれを複数回利用したり、自分のように source コマンドを使うために if で調べた後に source するみたいな rc の書き方をしていると sourceするファイル数 * 2回も brew --prefixを実行してしまいます。 なので初回に実行してそれを読み込めば多少は早くなるやろ。って考えでした。

これが思ったより効果的面でして、タイトルにあるように実測値で5倍弱の速さになりました。すごい!

最後に

今回はbashの起動速度というトピックでしたが、brewを使っている環境であればおそらくどの環境(zsh, fish)でも再現すると思います。 是非一度自分のdotfiles配下で git grep 'brew --prefix'をためしてみて、複数個見かけたらそれをやめてみてはどうでしょうか。きっと早くなると思います。

P.S. Macの標準シェルがzshになったのでそろそろ乗り換えようと思いつつもbashrcを移行するのがちょっとめんどくさくてまだできていません。


参考にしたもの。 - Profiling zsh startup time