Revisiting Knuth's “Premature Optimization” Paper
Meaning and Misuse of “Premature Optimization”
- Many argue the quote is chronically misused as “don’t think about performance” or “small optimizations are not worth it.”
- Commenters emphasize the full context: optimize only after identifying critical code paths, not before measuring; “premature” means “before you know where the bottleneck is.”
- Some note it’s now used as a thought‑terminating cliché to shut down discussion of improving code quality or performance.
Profiling, Hotspots, and Amdahl’s Law
- Strong agreement that profiling is essential: optimization before profiling is “a stab in the dark.”
- Several lament that many developers don’t use profilers or debuggers at all.
- Amdahl’s Law is cited: parallelization or local tweaks are useless if you don’t fix the true bottleneck, but also that complex systems can often be decomposed into many weakly‑coupled tasks.
- Debate on whether modern systems still have “3% hot code”: some see thin “peanut butter” overhead everywhere instead of clear hotspots.
Algorithms, Data Structures, and “Accidentally Quadratic” Code
- Repeated war stories: O(n²)/O(n³) loops where a hashmap, join, or better query turns hours into minutes/seconds.
- Many see this as not premature optimization but basic competence: avoid n+1 queries, use joins, dictionaries, proper schemas, and consider asymptotic complexity from the start.
- Warning against “premature pessimization”: using obviously bad algorithms and hiding behind Knuth.
Scale of Optimization: Micro vs Macro
- Distinction between micro‑tuning inner loops vs architectural changes that “don’t do the work at all” (e.g., fewer RPCs, better data layout).
- Small constant‑factor wins are vital in foundational libraries and runtimes used everywhere, less so in typical business apps.
- Some advocate constant “mechanical sympathy” (caches, NUMA, contention) over blind reliance on compilers.
Language, Architecture, and “Fix It Later”
- Using inherently slow stacks (e.g., heavy JSON, dynamic languages) and saying “we’ll fix performance later” often leads to unfixable designs and tech debt.
- Others counter that high‑velocity languages let you discover you’re building the wrong thing earlier; most apps are IO‑bound anyway.
- Choice of language for known hot, loop‑heavy workloads is framed as sensible upfront optimization, not premature.
Structured Programming and Knuth’s Original Paper
- Several note that the famous line is a tiny part of a broader paper on control structures, language design, and semi‑automatic transformations.
- Discussion of GOTOs, “one‑and‑a‑half” loops, iterators, and missing loop constructs in modern languages shows that much of the paper’s design thinking still feels relevant.