Zshの起動時間をチューニング ぱーと1

oh my zshを使えば便利なzsh環境をパパっと作れる!と知り、テキトーに使い続けてきた。
が!遅い!遅いよ!!Terminal起動するのに何秒かかるんだよ!2秒って!!

ノッている時や、急いでいる時に2秒手を止められるのはもの凄いストレス。

と、言うことで便利に、そして速く使える環境を目指す。

ボトルネックを探す

まず、zsh起動時に行っているタスクのうち、何が遅いのか調べなければどうしようもないので、原始的にechoコマンドを並べてボトルネックを探したところ、下記3つのタスクに時間を要しているもよう。

  1. oh my zsh の起動
  2. nvm の起動
  3. tmuxinator の起動

このうちtmuxinatorの起動はテキトーすぎて使いづらい所もあったので、単純に排除する事にした。

oh my zsh をアンインストール

oh my zshのforkとして始まったpreztoなるものがあるらしい。という事を知り、思い切ってoh my zshをアンインストール。

oh my zsh にはアンインストール用のスクリプトが付属しているので、これを実行するだけ。
念のため処理内容を確認したが、oh my zshのディレクトリが削除されるだけでzshrcファイルはそのまま残るもよう。

とりあえず uninstall_oh_my_zshを実行しアンインストール!

さよなら、oh my zsh。

nvm の代替ツール

node.js活用のため、nvmを利用しており、.zshrcsource $(brew --prefix nvm)/nvm.sh などとして起動スクリプトを実行していた。

このスクリプトが遅い!
Githubにissueもあげられており、コメントを参考に工夫してみたが、そもそもスクリプトが遅いので根本的な解決にはいたらない。

何か代替となるツールは無いかと検索し、候補が2つ見つかりました。
以下、それぞれについてメモ。

N

  • npmパッケージとして配布
  • 中身はbashスクリプト
  • 各バージョンのnode.js/io.jsのバイナリーを保持し、使用時に実体を置き換える事でバージョンのスイッチを実現
    • 実行ファイルコピーするらしく、都度root権限が必要
    • 実行ファイルのコピーなので、バージョンによってnode_moduleが動かなくなる可能性もあるとか
  • シンプルだが…うーん

nodebrew

  • perl実装
  • 日本人の方が開発しているらしい
  • Github上のStar数がnvm/nに比べて少ない
  • 英語圏の情報にはなかなかヒットしなかった
  • 使ってみない事にはどんなものか想像もつかない

と、いうことでnodebrewを使ってみる事にした。
(結果から言うと、最高!)

nodebrewをインストール & セットアップ

README.mdに丁寧に記載されているが、formulaが提供されていたので、homebrewを使ってインストールした。

$brew install nodebrew
$echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc

以上。これで本体のインストール、設定完了!

nodebrewもその他のツール同様、独自の環境変数NODEBREW_ROOTを設定してホームディレクトリを設定できる。デフォルトで$HOME/.nodebrewとなっているので、ここはいじらず。

nodebrew実行時、NODEBREW_ROOTに指定されたディレクトリが存在しない場合、自動で作成してくれるので、ディレクトリを作成する必要もなし。

必要なnode.jsの実体をインストールする

最新の安定版と、利用しているv0.10.36をインストールしました。

nodebrew install-binary stable # v4.0.0
nodebrew install-binary v0.10.36

あとはnodebrew use v4.0.0などとすることでnvmと同様に活用できる。

nodebrewの起動時間

nvmのnvm.shが遅い問題の解消が目的なので、多少使いづらくても…と思っていたのですが、使い勝手は全く問題なし。
そして問題の起動時間は、まったくのストレスフリー!!

速い!体感 ゼ ロ 秒!

続く…(かも)

oh my zshのアンインストール, nvm → nodebrewへの乗り換えでストレスは無くなったが、oh my zshの便利な機能郡も同時に失われたので、これを補いたい。

気分が向いたらブログにのこす。

SHOTA

I'm WEB developer

Tokyo, Japan http://senta.me/