⚡

ターミナル起動時間を1.3秒→0.1秒に高速化した話

に公開

はじめに

ターミナルを開くたびに「なんか遅いな...」と感じていませんか?

私も日々の開発作業でターミナルを頻繁に使うのですが、起動に 1 秒以上かかるのが地味にストレスでした。今回、zsh の設定を見直すことで1.3 秒 →0.1 秒まで高速化できたので、その方法を共有します。

現状把握:何が遅くしているのか

まずは .zshrc と .zprofile の内容を確認しました。主な設定は以下の通り:

  • 環境変数関連 (export PATH=...など)
  • エイリアスの設定
  • 開発ツールのセットアップ (nvm, jenv, rbenv, pyenv)

この中で最も怪しいのは開発ツールのセットアップ系です。これらは起動時に毎回 eval を実行するため、処理時間がかかります。

測定方法

改善効果を定量的に把握するため、以下のコマンドで起動時間を測定しました:

time zsh -i -c exit

このコマンドは新しい zsh セッションを開始して即座に終了するため、純粋な起動時間を測定できます。

改善前の状態

$ time zsh -i -c exit
zsh -i -c exit  0.41s user 0.52s system 72% cpu 1.281 total

約 1.3 秒という結果。待てなくはないですが、ワンテンポ遅くてイライラするレベルです。

改善策:遅延読み込みの導入

各開発ツールを遅延読み込みに変更していきました。遅延読み込みとは、実際にそのコマンドが実行されるまで初期化を遅らせる手法です。
以下の結果の時間は 10 回ほど回実行して一番中間且つ頻繁にで出てきてそうな値を採用してます。(これは自動でするスクリプトを AI に書かせたけど、うまくいかなくて、本質からズレるなと感じたので手動で実行しました)

1. NVM の遅延読み込み

変更前:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

変更後:

export NVM_DIR="$HOME/.nvm"
nvm() {
    unset -f nvm node npm
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
    nvm "$@"
}

結果:1.3 秒 → 0.85 秒 🎉

2. jenv の遅延読み込み

変更前:

export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
jenv enable-plugin export

変更後:

export PATH="$HOME/.jenv/bin:$PATH"
jenv() {
    unset -f jenv
    eval "$(command jenv init -)"
    jenv enable-plugin export
    jenv "$@"
}

結果:0.85 秒 → 0.4 秒 🎉

3. rbenv の遅延読み込み

変更前:

eval "$(rbenv init - zsh)"

変更後:

rbenv() {
    unset -f rbenv
    eval "$(command rbenv init - zsh)"
    rbenv "$@"
}

結果:0.4 秒 → 0.3 秒 🎉

4. pyenv の遅延読み込み

変更前:

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

変更後:

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
pyenv() {
    unset -f pyenv
    eval "$(command pyenv init -)"
    pyenv "$@"
}

結果:0.3 秒 → 0.1 秒 🎉

最終結果

ツール 起動時間 改善幅
改善前 1.3 秒 -
nvm 遅延読み込み 0.85 秒 -0.45 秒
jenv 遅延読み込み 0.4 秒 -0.45 秒
rbenv 遅延読み込み 0.3 秒 -0.1 秒
pyenv 遅延読み込み 0.1 秒 -0.2 秒

最終的に約 13 倍の高速化を実現しました!

遅延読み込みの仕組み

遅延読み込みがなぜ効果的なのか、仕組みを説明します:

従来の方法

  1. シェル起動時に eval "$(tool init -)" を実行
  2. 各ツールが環境変数やシェル関数を設定
  3. 毎回必ず実行される

遅延読み込み

  1. シェル起動時は関数定義のみ
  2. 実際にコマンドが呼ばれたときに初期化
  3. 使わなければ初期化されない
# 遅延読み込みのテンプレート
tool_name() {
    unset -f tool_name  # 関数を削除
    eval "$(command tool_name init -)"  # 実際の初期化
    tool_name "$@"  # 元のコマンドを実行
}

注意点

遅延読み込みには以下の注意点があります:

  1. 初回実行時に遅延が発生:最初にコマンドを使うときは初期化時間分遅くなる
  2. 環境変数の問題:一部の環境変数が起動時に設定されない場合がある
  3. スクリプトでの使用:非対話的なスクリプトで問題が起きる可能性

実際の使用では、これらの問題はほとんど気にならないレベルでした。
私の場合は毎回これらのツールを使うわけではないので遅延読み込みのデメリットを感じてませんが、人によってはターミナルの起動が多少遅くても構わないのでコマンドがすぐ実行されて欲しいという人もいるのかなと感じました。

その他の最適化テクニック

今回は開発ツールの遅延読み込みに焦点を当てましたが、他にも以下のような最適化手法があります:

  • PATH の重複削除
  • 不要なプラグインの削除
  • ファイル存在チェックの最適化
  • Git 情報取得の軽量化

まとめ

たった数行の変更で、ターミナル起動時間を13 倍高速化できました。

開発者にとってターミナルは日常的に使うツールです。小さな改善でも積み重なれば大きな生産性向上につながります。

皆さんも一度 .zshrc を見直してみてはいかがでしょうか?地味なストレスから解放されて、より快適な開発環境を手に入れることができますよ!


この記事が役に立ったら、ぜひ ♡ やコメントをお願いします!

Discussion