- Oh My Zsh(OMZ) は今でも広く推奨されているが、シェルの起動時間を遅くする不要なスクリプトのオーバーヘッドを招く
- OMZはシェルスクリプトで書かれているため、新しいターミナルタブを開くたびにすべてのスクリプトを解釈する必要があり、デフォルト設定だけでも約0.38秒の遅延が発生する
- シンプルな最小限のZsh設定とStarshipプロンプト、fzfベースの履歴検索を使えば、起動時間を0.07秒に短縮できる
- Starshipは1つのバイナリでプロンプトを構成し、従来のOMZのgit・仮想環境・言語別プラグインを置き換える
- 複雑なプラグインよりも、必要な機能だけを自分で追加する軽量なシェル構成のほうが効率的
Oh My Zshの性能問題
- Oh My Zsh(OMZ) は依然としてよく使われているが、不要な肥大化(bloat) によってシェルの起動速度を低下させる
- OMZはシェルスクリプトで構成されているため、新しいターミナルタブを開くたびにすべてのスクリプトを解釈しなければならない
- 基本プラグイン(git, zsh-autosuggestions, zsh-autocomplete)を含む設定で
/usr/bin/time -f "%e seconds" zsh -i -c exit を実行した結果、0.38秒を要した
- gitリポジトリのフォルダで新しいタブを開くと、体感では約1秒の遅延が発生する
- OMZは定期的にアップデートを確認し、この処理が数秒の追加遅延を引き起こす
- シェル設定を頻繁に更新するのは不要であり、必要な機能だけを直接追加するシンプルな構成が推奨される
最小限のZsh設定
プロンプトのカスタマイズ
履歴検索
- 一般的によく使われる
zsh-autosuggestions プラグインは、入力中に提案が表示されるため、注意をそらす可能性がある
- 代わりにfzfを
Ctrl+R にバインドし、対話的なファジー検索(fuzzy search) で履歴を探索する
source <(fzf --zsh)
性能改善の結果
追加のヒント
結論と利用事例
- OMZから移行した後、数日で新しいワークフローに適応した
- 必要なプラグインは自分で手動ロードできる
- 多数のタブを開く理由は、tmuxとターミナルベースのエディタ(helix) を併用しているため
- tmuxで
lazygit と yazi ファイルマネージャーをポップアップ形式で実行
- コード実行やテスト出力のための一時的な分割ウィンドウを使い、それぞれが別個のシェルセッションとして動作する
コメント要約
- 一部のユーザーは、OMZの起動時間は0.03秒程度で十分に速いと主張
- 筆者は zsh-autocomplete プラグインが速度を低下させると指摘
zsh-bench の結果では、OMZの最初のプロンプト遅延は603ms、シンプルなZsh設定は103msと測定された
- StarshipはOMZのプロンプト関連機能を単一ツールで置き換える
- 別のユーザーたちは、Zimfw、Atuin、自作のbashプロンプトなどの代替案に言及している
10件のコメント
最適化しないと本当に遅いですよね。とはいえ、手になじんだ機能が多くて、なかなか離れにくいです。
まだそこまで目立って不便だとは感じていませんでした。
Webサーバーでもないですし、不便を感じるほどでなければ、まあそういうものだと思います..
開発者らしいというか、どうでもいい数 ms くらいで大騒ぎしてるな(笑)
不要な数msのために技術が進歩しているのではなかったですか?
ターミナルを頻繁に使うなら、omz によって追加される遅延はかなり不快です。
自分は omz と一緒に使い始めたので、我慢するしかない不便さなんだと思っていました……。
最近はプラグインを一つずつ削除して、アップデート方針も変えたんですが……これを見ると、なくてもよさそうですね。
自分は tmuxinator で設定を読み込むときに omz update y/n が出ていると、あまり好きじゃないです。
数か月前にpreztoへ乗り換えたのですが、omzってこんなに遅かったかなとは思いましたね。
基本的なプラグインをいくつか入れただけでもかなり遅くなって……
自分はstarshipに乗り換えました
Hacker Newsのコメント
私が oh-my-zsh を使う理由はただ一つ。
新しいマシンでも、リモートホストでも、コンテナでも、すぐに使える 即戦力のシェル環境 を手に入れるため。
設定を自分でいじって何時間も使うくらいなら、その時間をもっと重要なことに使いたい
「インストールしてすぐ使える」体験はそのままで、200ms以上のプロンプト遅延 がない。
curl一行でインストールできて、設定も 簡単。使ってみても後悔しないと思う
一度設定ファイルを作って git で管理すれば、他のマシンでもそのまま使える。
私も新しいマシンをセットアップするときは dotfiles さえ持ってくれば、慣れた環境がすぐ戻る
冗談だけど、デフォルトのシェルを導入するより
.bashrcをコピーするほうがずっと簡単タブを開くたびに待たされるのがうっとうしかった。
結局 Homebrew で必要なプラグインをいくつか直接入れたが、1時間もかからなかった。
今は速くて軽いシェルで、ずっと 生産的で気分もいい
シェルの起動も非常に速く、セットアップも容易
だから私は fish に乗り換えた。
完全に自分好みというわけではないが、デフォルト設定が十分に良いので、そのまま慣れた。
もうシェル設定を気にすることはほとんどない
ただし初心者にはキーバインドをぜひ読んでほしい。
チームメイトが tab 補完や shift+arrow のような機能を知らず、そのせいで作業が遅くなっていたことがある
私はたまに vim バインディング や fuzzy find プラグイン を追加するくらい。
素の fish だけでも十分すばらしい
私は Vim モード を Zsh で有効にすることを勧める意見には同意しない。
デフォルトの readline でも単一コマンドには十分使いやすい。
長いコマンドは
C-x C-eで編集すればよい。ペアプログラミングをしていると、Vim モードの切り替えのせいでむしろ遅く見える
C-x C-eショートカットが本当に便利だと今知ったほとんどは insert モードにいて、大きな編集が必要なときだけ
C-x C-eを使うvi キーバインディングに慣れていれば、
w、b、dwのようなコマンドは 筋肉記憶 でより速い。エディタを開くのは流れを断ち、出力も隠してしまうので好まない。
シェルにも Vim の 文字間削除(di") のような機能があればいいのにと思う
私も oh-my-zsh は基本セットアップ用にしか使っていない。
git プラグインを1つ使うだけで、カスタム関数は自動ロードしている。
hyperfineで測ってみたところ、ログインシェルは 54ms、通常のシェルは 6ms ほどだった。380ms の遅延は別の原因かもしれないと思う
即時起動 が可能で、メンテナンスモードだからこそ時間の浪費を防げる
zsh -lはログインシェルなのでzshrcを読み込まない。zsh -ic exitでテストすべき。詳しくは zsh-bench ガイド を参照
zprofを.zshrcに追加して行うのがよい。extract、z、fzfのようなプラグインも試してみるとよい私は fish + starship の組み合わせに移行した。
fish はデフォルトで 自動補完と構文ハイライト を提供するので、oh-my-zsh の主要機能を置き換えられる。
関連記事 参照
そのため私は zsh+starship+簡単な init スクリプトを維持している。
fish が完全に「そのまま動く」ことを期待しているが、まだ物足りない
HEREDOC がなく、バックグラウンドブロックもできないのは不便だが、
最近は複雑なスクリプトより 単一バイナリにビルドされる言語 を好むようになった。
安定したら nushell に移るつもり
私は数年前に Zim に乗り換えた。
必要な機能はすべてあり、速くてインストールも簡単。
https://zimfw.sh/
さまざまなソースと形式をサポートし、zsh コード統合も優秀。
ほとんどのプラグインシステムより 速度と互換性 がずっと優れている。
本当に見事なフレームワーク
大学時代、15年ほど前に oh-my-zsh をインストールしたが、
そのときからとても満足していて、他のシェルや設定を試す必要を感じなかった。
新しいコンピュータをセットアップするときは毎回最初に入れる
長い間 oh-my-zsh を使ってきたが、今回は Claude を使って 5 分で削除した。
必要な機能だけを raw zsh で置き換えた。
starshipをプロンプトに使っているので、追加設定はほとんど必要なかった。今のところすべての機能は問題なく動いているようだ
oh-my-zsh の 0.5 秒の遅延 を問題視するのは大げさだと考える人もいる。
単に bash と KDE konsole を使えば十分だという。
シェルは単純な作業用ラッパーにすぎず、こうした細かな最適化を気にする必要はないという考え
それぞれのシェルが 作業フローの一部 なので、1秒の遅延でも体感は大きい。
だから速いシェルは重要だと思う
多くても 20 回程度で、そのくらいなら大した問題ではないという
性能が速いほうがよいのは確かだが、本質的な問題ではないと考えている
私の zsh 設定は 90 行ほどで、プラグインは 3 つ(compinit、vcs-info、edit-command-line)だけ。
起動から終了まで約 0.32 秒かかる。
大規模リポジトリではブランチ情報の取得で遅延が発生する。
bkt キャッシュユーティリティ(https://github.com/dimo414/bkt)でこうした問題を解決できる。
おそらく Starship も同様の方法でキャッシュを活用しているのだと思う