概要
- Zshシェルの起動が遅い問題の原因分析と改善手順
- zprofによるプロファイリング方法の紹介
- Oh-My-Zshや補完システム、Spaceship Promptの高速化設定
- プラグイン管理と最適な設定順序
- Before/Afterの設定例と効果比較
Zshシェル起動遅延のプロファイリングと高速化
-
Zshシェル の起動が毎回5秒以上かかる問題
-
長年そのまま使っていたが、なぜ遅いのか気になりプロファイリングを実施
-
zprof という組み込みプロファイラを使用
- .zshrcの先頭に
zmodload zsh/zprofを追記 - .zshrcの末尾に
zprofを追記 - 起動時に詳細な実行時間レポートを出力
- .zshrcの先頭に
-
プロファイリング結果(例)
_omz_source(Oh-My-Zshの読み込み): 55.73%compinit(補完システム): 30.76%syntax-highlight(シンタックスハイライト): 14.63%
Oh-My-Zshの高速化
-
Oh-My-Zsh の自動更新や不要な機能を無効化
.zshrc先頭に以下を追加DISABLE_AUTO_UPDATE="true"DISABLE_MAGIC_FUNCTIONS="true"DISABLE_COMPFIX="true"
-
JonLucaの調査によると、これで読み込み時間が半分程度に短縮
補完システム(compinit)の最適化
-
compinit は補完キャッシュを毎回再構築するため遅い
-
キャッシュを1日1回だけ再構築する設定に変更
autoload -Uz compinit if [ "$(date +'%j')" != "$(stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)" ]; then compinit else compinit -C fi -
GitHub Gistなどで共有されているテクニック
Spaceship Promptの高速化
-
Spaceship Prompt は便利だが重い場合がある
-
非同期表示や最小限のセクションのみ表示する設定
SPACESHIP_PROMPT_ASYNC=trueSPACESHIP_PROMPT_ADD_NEWLINE=trueSPACESHIP_CHAR_SYMBOL="⚡"SPACESHIP_PROMPT_ORDER=( time user dir git line_sep char )
-
必要な項目だけに絞ることで大幅に高速化
プラグイン管理とパフォーマンス
-
プラグイン数は最小限に絞る
-
zsh-syntax-highlighting は必ず最後に記述
plugins=( git zsh-autosuggestions zsh-syntax-highlighting ) -
zsh-autosuggestionsのパフォーマンス設定
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE="20"ZSH_AUTOSUGGEST_USE_ASYNC=1
効果比較(Before/After)
| コンポーネント | Before | After | |-----------------------|--------|--------| | Oh-My-Zsh | 55.73% | ~20% | | 補完システム | 30.76% | ~10% | | シンタックスハイライト | 14.63% | ~8% | | 総起動時間 | ~5秒 | ~0.5秒 |
- 体感で10倍の高速化を実現
Before/Afterの設定例
Before(一部抜粋)
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="spaceship"
SPACESHIP_PROMPT_ASYNC=false
plugins=( git zsh-syntax-highlighting zsh-autosuggestions )
source $ZSH/oh-my-zsh.sh
# ...(他にも多数の設定)
After(最適化後)
DISABLE_AUTO_UPDATE="true"
DISABLE_MAGIC_FUNCTIONS="true"
DISABLE_COMPFIX="true"
autoload -Uz compinit
if [ "$(date +'%j')" != "$(stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)" ]; then
compinit
else
compinit -C
fi
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="spaceship"
SPACESHIP_PROMPT_ASYNC=true
SPACESHIP_PROMPT_ADD_NEWLINE=true
SPACESHIP_CHAR_SYMBOL="⚡"
SPACESHIP_PROMPT_ORDER=( time user dir git line_sep char )
plugins=( git zsh-autosuggestions zsh-syntax-highlighting )
source $ZSH/oh-my-zsh.sh
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#663399,standout"
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE="20"
ZSH_AUTOSUGGEST_USE_ASYNC=1
# ...(他にも最適化済みの設定)
その他の選択肢と感想
- Starship や Pure prompt、 fast-syntax-highlighting、 Zinit などの高速化ツールも存在
- 個人的にはZsh+Oh-My-Zsh+Spaceshipの組み合わせに満足
- 現状のセットアップが十分速ければ無理に変更しなくてもOK
- 好奇心で試した結果、劇的に快適なシェル環境を実現
- 同じ悩みを持つ方の参考になれば幸い