早すぎる最適化 — 測る前に速さを追う
計測せずに書いた「速そうなコード」が、なぜ効かない上に読めなくなるのかが分かる。ボトルネックを先に見つけてから最適化する、正しい順番が身につく。
- 早すぎる最適化とは、実測でボトルネックを特定する前に、勘で速そうなコードを書くこと。プログラムの時間の大半はごく一部に集中しているのに、そうでない場所を磨いてしまう。
- コストは二重。効かない場所を最適化して時間を浪費し、しかも可読性を犠牲にして将来のバグと保守コストを増やす。
- 正しい順番は、まず素直に正しく書く→計測(プロファイル)でボトルネックを特定→そこだけ最適化→再計測で効果を確認。推測ではなく測定で動く。
「ここはループだから速く書いておこう」「文字列結合は遅いと聞いたから」——良かれと思って書いた最適化が、実は何の役にも立たず、ただコードを読めなくしているだけ。これが早すぎる最適化です。
横にスクロール
症状:どう気づくか
- 「なぜこんな書き方?」と聞くと、「速いと思って」という答えが返る(実測データは無い)。
- ホットパスでもない場所に、技巧的で読みにくいコードがある。
- ベンチマークやプロファイルの結果がどこにも無いまま、性能を理由にした設計判断がされている。
なぜ悪いのか
プログラムの実行時間は、ごく一部のコードに集中しています。経験則としてよく言われるのが「時間の8割は2割のコードで消費される」。つまり、大半の場所をいくら磨いても全体はほとんど速くならない。
早すぎる最適化は、その「効かない8割」に労力を注いでしまう行為です。しかも代償が二重にかかります。ひとつは、効かない最適化に費やす時間そのもの。もうひとつは、可読性の犠牲です。技巧的なコードはバグを生みやすく、後から読む人(半年後の自分を含む)の理解を妨げ、保守コストを恒久的に上げます。速くならないのに、負債だけが残る。
「早すぎる最適化は諸悪の根源である」——Donald Knuth のこの言葉は、しばしば前後を省いて引用されます。本来の主旨は「小さな効率を、97%の時間について気にするな。ただし残り3%(クリティカルな部分)の機会は逃すな」。最適化を否定しているのではなく、場所を見極めてからやれ、という話です。
直し方
順番を守るだけです。
- まず素直に、正しく書く。 読みやすさを優先し、動くものを作る。
- 計測する。 プロファイラで、実際にどこで時間を使っているかを測る。推測しない。
- ボトルネックだけ最適化する。 測って見つかった上位の箇所に絞って手を入れる。
- 再計測する。 本当に速くなったか、数字で確認する。効いていなければ戻す。
やりがちな順番(誤): 推測 → 最適化 → (効かない・読めない)
正しい順番: 計測 → ボトルネック特定 → そこだけ最適化 → 再計測
これは「性能を考えるな」という話ではありません。設計レベルの選択——アルゴリズムの計算量、N+1の回避、適切なデータ構造——は最初から効かせるべきで、後から直すのが高くつきます。避けるべきは局所的な小細工を、測りもせず先回りで入れること。大局は設計で、小局は計測後に、と使い分けます。
まとめ
- 早すぎる最適化とは、計測せず勘で速そうなコードを書くこと。時間の大半はごく一部に集中しているのに、効かない場所を磨いてしまう。
- コストは二重。効かない労力と可読性の犠牲(将来のバグ・保守負債)。
- 正しい順番はまず正しく書く→計測→ボトルネックだけ最適化→再計測。推測でなく測定で動く。
- ただしアルゴリズムや計算量の設計判断は最初から。局所的な小細工だけを先回りしないこと。
アンチパターン図鑑の記事ガイド
早すぎる最適化 — 測る前に速さを追うを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
最適化
比較で見る軸
難易度: intermediate / カテゴリ: アンチパターン図鑑 / タグ数: 5
導入後に効く点
コストは二重。効かない場所を最適化して時間を浪費し、しかも可読性を犠牲にして将来のバグと保守コストを増やす。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- アンチパターン図鑑
- タグ数
- 5
判断チェックリスト
- 自社の用途が「最適化 / プロファイリング」に近いか確認する。
- 強みである「早すぎる最適化とは、実測でボトルネックを特定する前に、勘で速そうなコードを書くこと。プログラムの時間の大半はごく一部に集中しているのに、そうでない場所を磨いてしまう。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。