早すぎる最適化 — 測る前に速さを追う

計測せずに書いた「速そうなコード」が、なぜ効かない上に読めなくなるのかが分かる。ボトルネックを先に見つけてから最適化する、正しい順番が身につく。

中級最適化プロファイリングパフォーマンス計測アンチパターン最終更新: 2026-07-28
3つの要点
TL;DR
  1. 早すぎる最適化とは、実測でボトルネックを特定する前に、勘で速そうなコードを書くこと。プログラムの時間の大半はごく一部に集中しているのに、そうでない場所を磨いてしまう。
  2. コストは二重。効かない場所を最適化して時間を浪費し、しかも可読性を犠牲にして将来のバグと保守コストを増やす。
  3. 正しい順番は、まず素直に正しく書く→計測(プロファイル)でボトルネックを特定→そこだけ最適化→再計測で効果を確認。推測ではなく測定で動く。

「ここはループだから速く書いておこう」「文字列結合は遅いと聞いたから」——良かれと思って書いた最適化が、実は何の役にも立たず、ただコードを読めなくしているだけ。これが早すぎる最適化です。

横にスクロール

推測による複雑化を計測・特定・検証の改善ループへ変える比較
性能目標とボトルネックを測ってから、効果を検証できる小さな変更を行う。

症状:どう気づくか

  • 「なぜこんな書き方?」と聞くと、「速いと思って」という答えが返る(実測データは無い)。
  • ホットパスでもない場所に、技巧的で読みにくいコードがある。
  • ベンチマークやプロファイルの結果がどこにも無いまま、性能を理由にした設計判断がされている。

なぜ悪いのか

プログラムの実行時間は、ごく一部のコードに集中しています。経験則としてよく言われるのが「時間の8割は2割のコードで消費される」。つまり、大半の場所をいくら磨いても全体はほとんど速くならない

早すぎる最適化は、その「効かない8割」に労力を注いでしまう行為です。しかも代償が二重にかかります。ひとつは、効かない最適化に費やす時間そのもの。もうひとつは、可読性の犠牲です。技巧的なコードはバグを生みやすく、後から読む人(半年後の自分を含む)の理解を妨げ、保守コストを恒久的に上げます。速くならないのに、負債だけが残る。

有名な戒め

「早すぎる最適化は諸悪の根源である」——Donald Knuth のこの言葉は、しばしば前後を省いて引用されます。本来の主旨は「小さな効率を、97%の時間について気にするな。ただし残り3%(クリティカルな部分)の機会は逃すな」。最適化を否定しているのではなく、場所を見極めてからやれ、という話です。

直し方

順番を守るだけです。

  1. まず素直に、正しく書く。 読みやすさを優先し、動くものを作る。
  2. 計測する。 プロファイラで、実際にどこで時間を使っているかを測る。推測しない。
  3. ボトルネックだけ最適化する。 測って見つかった上位の箇所に絞って手を入れる。
  4. 再計測する。 本当に速くなったか、数字で確認する。効いていなければ戻す。
やりがちな順番(誤):  推測 → 最適化 → (効かない・読めない)
正しい順番:            計測 → ボトルネック特定 → そこだけ最適化 → 再計測
「最適化するな」ではない

これは「性能を考えるな」という話ではありません。設計レベルの選択——アルゴリズムの計算量、N+1の回避、適切なデータ構造——は最初から効かせるべきで、後から直すのが高くつきます。避けるべきは局所的な小細工を、測りもせず先回りで入れること。大局は設計で、小局は計測後に、と使い分けます。

まとめ

  • 早すぎる最適化とは、計測せず勘で速そうなコードを書くこと。時間の大半はごく一部に集中しているのに、効かない場所を磨いてしまう。
  • コストは二重。効かない労力可読性の犠牲(将来のバグ・保守負債)。
  • 正しい順番はまず正しく書く→計測→ボトルネックだけ最適化→再計測。推測でなく測定で動く。
  • ただしアルゴリズムや計算量の設計判断は最初から。局所的な小細工だけを先回りしないこと。

アンチパターン図鑑の記事ガイド

早すぎる最適化 — 測る前に速さを追うを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

最適化

比較で見る軸

難易度: intermediate / カテゴリ: アンチパターン図鑑 / タグ数: 5

導入後に効く点

コストは二重。効かない場所を最適化して時間を浪費し、しかも可読性を犠牲にして将来のバグと保守コストを増やす。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
intermediate
カテゴリ
アンチパターン図鑑
タグ数
5

判断チェックリスト

  • 自社の用途が「最適化 / プロファイリング」に近いか確認する。
  • 強みである「早すぎる最適化とは、実測でボトルネックを特定する前に、勘で速そうなコードを書くこと。プログラムの時間の大半はごく一部に集中しているのに、そうでない場所を磨いてしまう。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

最適化プロファイリングパフォーマンス計測アンチパターン