17 ポイント 投稿者 GN⁺ 2026-01-11 | 10件のコメント | WhatsAppで共有
  • 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設定は次のとおり
    export HISTSIZE=1000000000
    export SAVEHIST=$HISTSIZE
    setopt EXTENDED_HISTORY
    setopt autocd
    autoload -U compinit; compinit
    
    • HISTSIZESAVEHIST はコマンド履歴のサイズを指定
    • EXTENDED_HISTORY は履歴にタイムスタンプを追加
    • autocdcd コマンドなしでディレクトリ移動を可能にする
    • compinit自動補完システムを初期化する
  • この設定だけでも、補完機能を含む基本的なシェル環境を提供できる

プロンプトのカスタマイズ

  • プロンプトにはStarshipを使用
    • Starshipは1つのバイナリで構成された高速かつ最小限のプロンプト
    • 従来のOMZのプラグインやテーマを置き換え、git・仮想環境・言語別の状態を表示する
  • Starshipの設定例では、AWS、GCP、Azure、NodeJSなどクラウド関連の表示を無効化して視覚的ノイズを減らしている
  • PythonとRustのプロジェクトでは、それぞれの言語がプロンプト上で強調表示され、コマンド実行時間も表示される
  • .zshrc に次の1行を追加して有効化する
    eval "$(starship init zsh)"
    

履歴検索

  • 一般的によく使われる zsh-autosuggestions プラグインは、入力中に提案が表示されるため、注意をそらす可能性がある
  • 代わりにfzfCtrl+R にバインドし、対話的なファジー検索(fuzzy search) で履歴を探索する
    source <(fzf --zsh)
    

性能改善の結果

  • 上記の設定を適用した後のシェル起動時間は次のとおり
    ❯ /usr/bin/time -f "%e seconds" zsh -i -c exit
    0.07 seconds
    
  • OMZと比べて約5倍以上速い起動速度を実現

追加のヒント

  • VimユーザーはZshでVimモードを有効にして、コマンド編集速度を向上させられる
    set -o vi
    bindkey -v '^?' backward-delete-char
    
    • zle はデフォルトでEmacsキー バインディングを使用するため、この設定でVim方式の入力をサポートする

結論と利用事例

  • OMZから移行した後、数日で新しいワークフローに適応した
  • 必要なプラグインは自分で手動ロードできる
  • 多数のタブを開く理由は、tmuxとターミナルベースのエディタ(helix) を併用しているため
    • tmuxで lazygityazi ファイルマネージャーをポップアップ形式で実行
    • コード実行やテスト出力のための一時的な分割ウィンドウを使い、それぞれが別個のシェルセッションとして動作する

コメント要約

  • 一部のユーザーは、OMZの起動時間は0.03秒程度で十分に速いと主張
  • 筆者は zsh-autocomplete プラグインが速度を低下させると指摘
  • zsh-bench の結果では、OMZの最初のプロンプト遅延は603ms、シンプルなZsh設定は103msと測定された
  • StarshipはOMZのプロンプト関連機能を単一ツールで置き換える
  • 別のユーザーたちは、ZimfwAtuin自作のbashプロンプトなどの代替案に言及している

10件のコメント

 
roxie 2026-02-27

最適化しないと本当に遅いですよね。とはいえ、手になじんだ機能が多くて、なかなか離れにくいです。

 
tesha001 2026-01-12

まだそこまで目立って不便だとは感じていませんでした。

 
princox 2026-01-12

Webサーバーでもないですし、不便を感じるほどでなければ、まあそういうものだと思います..

 
zxcv123 2026-01-11

開発者らしいというか、どうでもいい数 ms くらいで大騒ぎしてるな(笑)

 
kayws426 2026-01-12

不要な数msのために技術が進歩しているのではなかったですか?

 
t7vonn 2026-01-11

ターミナルを頻繁に使うなら、omz によって追加される遅延はかなり不快です。

 
edunga1 2026-01-12

自分は omz と一緒に使い始めたので、我慢するしかない不便さなんだと思っていました……。
最近はプラグインを一つずつ削除して、アップデート方針も変えたんですが……これを見ると、なくてもよさそうですね。
自分は tmuxinator で設定を読み込むときに omz update y/n が出ていると、あまり好きじゃないです。

 
devfluotin 2026-01-12

数か月前にpreztoへ乗り換えたのですが、omzってこんなに遅かったかなとは思いましたね。
基本的なプラグインをいくつか入れただけでもかなり遅くなって……

 
wedding 2026-01-14

自分はstarshipに乗り換えました

 
GN⁺ 2026-01-11
Hacker Newsのコメント
  • 私が oh-my-zsh を使う理由はただ一つ。
    新しいマシンでも、リモートホストでも、コンテナでも、すぐに使える 即戦力のシェル環境 を手に入れるため。
    設定を自分でいじって何時間も使うくらいなら、その時間をもっと重要なことに使いたい

    • Starship を試してみることを勧めたい。
      「インストールしてすぐ使える」体験はそのままで、200ms以上のプロンプト遅延 がない。
      curl 一行でインストールできて、設定も 簡単
      使ってみても後悔しないと思う
    • もしカスタム設定を許可しているマシンなら、自作の dotfiles をコピーして使うほうがよいと思う。
      一度設定ファイルを作って git で管理すれば、他のマシンでもそのまま使える。
      私も新しいマシンをセットアップするときは dotfiles さえ持ってくれば、慣れた環境がすぐ戻る
    • そもそも dotfiles ってそのためにあるのでは?
      冗談だけど、デフォルトのシェルを導入するより .bashrc をコピーするほうがずっと簡単
    • 私も Oh My Zsh を使っていたが、遅すぎてやめた。
      タブを開くたびに待たされるのがうっとうしかった。
      結局 Homebrew で必要なプラグインをいくつか直接入れたが、1時間もかからなかった。
      今は速くて軽いシェルで、ずっと 生産的で気分もいい
    • Zim も悪くない。Oh My Zsh より速く、設定も簡単
      シェルの起動も非常に速く、セットアップも容易
  • だから私は fish に乗り換えた。
    完全に自分好みというわけではないが、デフォルト設定が十分に良いので、そのまま慣れた。
    もうシェル設定を気にすることはほとんどない

    • このアプローチの利点は、どのホストでも fish をインストールすれば 追加設定なしで同じ環境 を使える点
    • fish は素の状態でも 性能が高く、UX も優秀
      ただし初心者にはキーバインドをぜひ読んでほしい。
      チームメイトが tab 補完や shift+arrow のような機能を知らず、そのせいで作業が遅くなっていたことがある
    • デフォルト設定で何が足りないのか気になる。
      私はたまに vim バインディングfuzzy find プラグイン を追加するくらい。
      素の fish だけでも十分すばらしい
  • 私は Vim モード を Zsh で有効にすることを勧める意見には同意しない。
    デフォルトの readline でも単一コマンドには十分使いやすい。
    長いコマンドは C-x C-e で編集すればよい。
    ペアプログラミングをしていると、Vim モードの切り替えのせいでむしろ遅く見える

    • C-x C-e ショートカットが本当に便利だと今知った
    • 私も Vim モードを有効にした後で readline バインディングを追加し直した
      ほとんどは insert モードにいて、大きな編集が必要なときだけ C-x C-e を使う
    • モード切り替えはキー1回で済むので、遅くなる理由はない。
      vi キーバインディングに慣れていれば、wbdw のようなコマンドは 筋肉記憶 でより速い。
      エディタを開くのは流れを断ち、出力も隠してしまうので好まない。
      シェルにも Vim の 文字間削除(di") のような機能があればいいのにと思う
  • 私も oh-my-zsh は基本セットアップ用にしか使っていない。
    git プラグインを1つ使うだけで、カスタム関数は自動ロードしている。
    hyperfine で測ってみたところ、ログインシェルは 54ms、通常のシェルは 6ms ほどだった。
    380ms の遅延は別の原因かもしれないと思う

    • zsh の性能に関心があるなら zsh4humans を勧める。
      即時起動 が可能で、メンテナンスモードだからこそ時間の浪費を防げる
    • zsh -l はログインシェルなので zshrc を読み込まない。
      zsh -ic exit でテストすべき。
      詳しくは zsh-bench ガイド を参照
    • より正確な測定は、zprof.zshrc に追加して行うのがよい。
      zmodload zsh/zprof
      ...
      zprof
      
    • git リポジトリ内でベンチマークしてみるのも勧めたい
    • extractzfzf のようなプラグインも試してみるとよい
  • 私は fish + starship の組み合わせに移行した。
    fish はデフォルトで 自動補完と構文ハイライト を提供するので、oh-my-zsh の主要機能を置き換えられる。
    関連記事 参照

    • ただし fish は POSIX 互換ではない ので不便な面がある。
      そのため私は zsh+starship+簡単な init スクリプトを維持している。
      fish が完全に「そのまま動く」ことを期待しているが、まだ物足りない
    • 私も何十年も zsh を使ってきたが、去年から fish に変えてそのまま使っている。
      HEREDOC がなく、バックグラウンドブロックもできないのは不便だが、
      最近は複雑なスクリプトより 単一バイナリにビルドされる言語 を好むようになった。
      安定したら nushell に移るつもり
    • 実際、fish は 素の状態でも十分すばらしい ので、ほとんどカスタマイズが要らない
  • 私は数年前に Zim に乗り換えた。
    必要な機能はすべてあり、速くてインストールも簡単
    https://zimfw.sh/

    • Zimfw は非常に高速で柔軟なインストールシステム を備えている。
      さまざまなソースと形式をサポートし、zsh コード統合も優秀。
      ほとんどのプラグインシステムより 速度と互換性 がずっと優れている。
      本当に見事なフレームワーク
  • 大学時代、15年ほど前に oh-my-zsh をインストールしたが、
    そのときからとても満足していて、他のシェルや設定を試す必要を感じなかった。
    新しいコンピュータをセットアップするときは毎回最初に入れる

  • 長い間 oh-my-zsh を使ってきたが、今回は Claude を使って 5 分で削除した。
    必要な機能だけを raw zsh で置き換えた。
    starship をプロンプトに使っているので、追加設定はほとんど必要なかった。
    今のところすべての機能は問題なく動いているようだ

  • oh-my-zsh の 0.5 秒の遅延 を問題視するのは大げさだと考える人もいる。
    単に bash と KDE konsole を使えば十分だという。
    シェルは単純な作業用ラッパーにすぎず、こうした細かな最適化を気にする必要はないという考え

    • しかしターミナル中心で作業していると、1日に何十個ものシェルを開くことになる。
      それぞれのシェルが 作業フローの一部 なので、1秒の遅延でも体感は大きい。
      だから速いシェルは重要だと思う
    • 逆に、1日にシェルを何回開くのかと問う人もいる。
      多くても 20 回程度で、そのくらいなら大した問題ではないという
    • また別の人は、この問題は単に 個人の好み と見るのが妥当だと言う。
      性能が速いほうがよいのは確かだが、本質的な問題ではないと考えている
  • 私の zsh 設定は 90 行ほどで、プラグインは 3 つ(compinit、vcs-info、edit-command-line)だけ。
    起動から終了まで約 0.32 秒かかる。
    大規模リポジトリではブランチ情報の取得で遅延が発生する。
    bkt キャッシュユーティリティhttps://github.com/dimo414/bkt)でこうした問題を解決できる。
    おそらく Starship も同様の方法でキャッシュを活用しているのだと思う