高速ターミナル再考:Zsh高速化の誤解と正しい測定法
Zsh高速化の誤解を指摘した記事が話題に。起動時間測定の誤り、プラグインマネージャーへの偏見、シンタックスハイライターの選択ミスなど、実践的な訂正内容から学ぶべきポイントを解説する。
Zshユーザの間で、高速化手法をめぐる議論が再燃している。端を発したのは、Mijndert Stuij氏が公開した「Life is too short for a slow terminal」という記事だ。この記事は、Zshの起動時間を30msまで削減する設定を紹介し、多くの読者を集めた。しかし、その直後に同氏は訂正記事を公開した。測定方法、プラグインマネージャーの評価、推奨プラグインの選択に誤りがあったと認め、詳細な自己批判を行ったのである。
本稿では、この訂正記事の内容を基に、Zsh高速化における本質的な論点を整理する。単なる間違いの指摘ではなく、パフォーマンス測定のあり方や、ツール選択の判断基準といった、より広範な教訓を読み解く。
測定対象の誤り
元記事の核心的な問題は、起動時間の測定方法にあった。Stuij氏は以下のコマンドで時間を計測していた。
$ for i in {1..5}; do /usr/bin/time zsh -i -c exit; done
このコマンドは、対話的シェルを起動し、即座に終了するまでの総時間を測定する。これは多くのエンジニアが最初に思いつくベンチマークだが、zsh-benchというツールが指摘するように、ユーザが実際に体感するパフォーマンスとは異なる指標だ。
ユーザが待つのは、プロンプトが表示されるまでの時間、最初のコマンドが実行されるまでの時間、そしてその後のキーストロークごとの遅延である。これらは総起動時間とは独立した値を持つ。設定によっては、起動時間が遅くても体感的に速いケースがあり得る。
zsh-benchは、これらの体感指標を測定する。具体的には、ファーストプロンプト表示時間、初回コマンド実行時間、コマンド遅延、入力遅延の4つだ。Stuij氏自身も、測定セクションを書き直すならzsh-benchを推奨すると述べている。
さらに重要なのが、instant promptという仕組みの存在だ。これは、シェル起動時にキャッシュされたプロンプトを即座に表示し、.zshrcの読み込み完了を待たずに入力を可能にする。この仕組みを採用すれば、起動時間の絶対値はほとんど意味を失う。30msのシェルも、300msのシェルも、instant promptを使えば体感起動時間はほぼゼロになるからだ。
プラグインマネージャーへの誤解
元記事では、プラグインマネージャーが「オーバーヘッドを追加する」と一般化していた。さらに「起動時に依存関係解決を行う」と批判した。
Stuij氏はこの点について、特定の実装にのみ当てはまる主張をカテゴリ全体に拡張してしまったと認めている。例えば、antidoteはプラグインのリストを単一の静的スクリプトにコンパイルする。起動時には、生成済みのファイルを1つ読み込むだけであり、解決処理は発生しない。これは同氏が自身の手書き設定で評価していた「ソース行を並べる手法」と本質的に同じ動作だ。
同氏は訂正の結論として、起動のたびに依存解決を行うヘビーなフレームワークは遅いが、モダンな静的バンドル型マネージャーは遅くなく、さらにアップデート管理を自動化できるメリットがあると述べている。
シンタックスハイライターの選択ミス
入力遅延に言及した記事でありながら、Stuij氏はzsh-syntax-highlightingを推奨していた。このプラグインは、キーストロークのたびにバッファ全体を再ハイライトする。長いコマンドラインでは、これが顕著な遅延を引き起こす。
同氏は、この選択を「少し恥ずかしい」と表現している。代替案として、Zsh-patinaという新しい実装が注目に値すると紹介している。Zsh-patinaは、差分のみをハイライトする手法を採用しており、長いコマンドラインでのパフォーマンスが大幅に改善されている。
高速化の本質
この一連の訂正が示すのは、シェル高速化の議論が、測定指標の選択と、ツールの動作原理の理解に依存するということだ。総起動時間という単一の数値に固執すると、実際のユーザ体験を見誤る。instant promptやzsh-benchのような、体感を正確に捉えるツールの活用が不可欠である。
また、プラグインマネージャーに対する「オーバーヘッド」という批判も、実装ごとに動作が異なるため、一般化は危険だ。antidoteのような静的バンドル型は、手書き設定と同等以上の効率を発揮する。シンタックスハイライターに至っては、選択次第で体感速度が大きく変わる。
Stuij氏の訂正は、自身の過ちを率直に認め、コミュニティからのフィードバックを積極的に取り入れた好例と言える。同氏が「弁護よりも訂正の方が有用だ」と述べている通り、この種の自己批判は、読者にとって貴重な学習機会を提供する。
編集部の見解
短期的影響
この訂正は、Zshコミュニティ内でのベンチマーク手法の見直しを促進するだろう。従来のtime zsh -i -c exitによる測定から、zsh-benchやinstant promptを考慮した評価へと移行する動きが加速する。また、antidoteやZsh-patinaのようなモダンなツールへの関心が高まることが予想される。
長期的視点
シェル高速化の議論は、単なる設定の最適化から、ツールの選択と動作原理の理解へと深化していく。ユーザは、ブラックボックス的な高速化手法ではなく、各ツールが内部で何を行っているかを把握した上で選択するようになる。この傾向は、Zsh以外のシェルや、エディタ、ターミナルエミュレータなど、他の開発ツールにも波及する可能性がある。
編集部からの問い
シェルパフォーマンスにおいて、ユーザが本当に重視すべきは絶対的な起動時間なのか、それとも体感的な応答性なのか。この問いは、ソフトウェアのパフォーマンス最適化全般に通じる普遍的なテーマである。数値目標にこだわるあまり、実際のユーザ体験を見失っていないだろうか。
参考
- What I got wrong about fast terminals — 2026-06-08公開
- zsh-bench — 体感パフォーマンス測定ツール
よくある質問
- zsh-benchはどのように体感パフォーマンスを測定するのか
- zsh-benchは、プロンプト表示までの時間、最初のコマンド実行時間、コマンド遅延、入力遅延の4つの指標を測定する。これにより、ユーザが実際に待たされる箇所を特定できる。総起動時間ではなく、体感速度に直結する数値を提供する点が従来のベンチマークと異なる。
- instant promptの仕組みとは何か
- instant promptは、シェル起動時にキャッシュされたプロンプトを即座に表示する仕組みだ。.zshrcの読み込み完了を待たずに入力を開始できるため、起動時間の絶対値が大きくても体感起動時間はほぼゼロになる。zsh-users/zsh-autosuggestionsやpowerlevel10kなどがこの機能を提供している。
- 静的バンドル型のプラグインマネージャーとはどのようなものか
- 静的バンドル型は、プラグインのリストをあらかじめコンパイルし、単一の静的スクリプトとして保存する。起動時にはこの生成済みファイルを読み込むだけで、依存解決や動的な読み込みは行われない。antidoteが代表的な実装であり、手書きのsource行と同等のパフォーマンスを実現する。
コメント