Performance work fails quietly when the measurement is theatrical. A chart goes up; a narrative forms; nobody can reproduce the run three weeks later.

This note is a short checklist I use when I am trying to learn something real about a system — whether a C++ microbenchmark on Linux or a batch pipeline that “feels” slower after a refactor.

Start with a question, not a knob

“Make it faster” is not a question. Better:

  • Which percentile matters?
  • Under what input shape?
  • Against which baseline commit?
  • On which machine and power settings?

If you cannot answer those, you are not measuring yet — you are improvising.

Capture the environment

At minimum:

  • CPU model, core count, memory
  • OS and kernel
  • Compiler and flags
  • Frequency governor / turbo behavior (when relevant)
  • Commit SHA and build ID

Boring metadata is what turns a result into something you can argue with later.

Prefer paired comparisons

Run A and B under the same harness. Randomize order if the machine warms up. Report distributions, not a single heroic number. If the difference is smaller than run-to-run noise, say so.

hypothesis → harness → baseline → change → remeasure → write it down

Watch for self-deception

Common traps:

  • Optimizing a microbenchmark the production path never hits
  • Letting the compiler delete your workload
  • Confusing mean latency with tail latency
  • Cherry-picking the best of N runs

The fix is social as much as technical: write the hypothesis before you see the chart.

What “good enough” looks like

You do not need a journal paper. You need:

  1. A reproducible command
  2. A before/after comparison
  3. A one-paragraph interpretation that admits uncertainty

That standard transfers. It is the same discipline that keeps data platforms honest when someone asks whether a pipeline change “improved quality.”

Further reading