benchmarks/history: re-measure the series 1-up and add v0.9.0 - #328
Merged
Conversation
|
All contributors have signed the CLA ✍️ ✅ |
The README said a new release could not simply be appended: every committed run predated -align-loops=64, so a v0.9.0 column measured with the current flags would have been compared against rows measured without them. Re-measuring the whole matrix was the prescribed fix. Measurement also moved from 32-way self-concurrent — 32 copies of a shape's binary at once, one per core — to 1-up: one process, pinned to one core, with the box otherwise idle. Concurrent benchmark processes contend for cache and memory bandwidth, and the series is meant to support comparison between shapes, where an uneven bias is worse than a noisy one. Spread came out substantially tighter: across all 560 cells p50 ~0.65% / p90 ~3.6%. run-series.sh drives that: it deals the binaries across several bare-metal boxes so parallelism comes from more machines rather than more cores of one, calls bench-on-metal per binary rather than reimplementing the remote path, retries provisioning across AZs because metal spot capacity comes and goes, and records instance ids so a crashed dispatcher still leaves a cleanup list. Subnets come from BENCH_SUBNETS rather than being baked in, so the script is usable outside the account it was written in. mesh and column_batch are backported to every release. The harness belongs to the tooling rather than to any release, so shapes added late can still be measured across the whole history — and that changes what v0.9.0's decode work looks like. It reads as +32% on packed_tile, the short-array shape that existed when the work landed, and +113% on column_batch/decode, the long-column shape it was written for. Each historical-benchmark branch carries the backported harness so the new cells stay rebuildable. Recorded alongside the wins: view decode on the two most message-dense shapes is down 8.2% on spreads under 4%, and google_message1_proto3 has now declined two releases running. Not root-caused; annotated rather than left in a chart for someone to find. The docs are brought in line with all of this — the discharged re-measurement warning, the release range, the spread figures and benchmark count, the capture step, and the tooling list, which had never mentioned run-series.sh.
iainmcgin
force-pushed
the
bench/v090-history
branch
from
July 18, 2026 18:14
43499e3 to
615b567
Compare
asacamano
approved these changes
Sep 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds v0.9.0 to the performance history — but not by appending a column, because the README forbade that and the reason turned out to understate the problem.
Why the whole series was re-measured
The stated reason: every committed run predates
-align-loops=64. A v0.9.0 column measured with the current flags would sit beside rows measured without them, and the README's standing warning says to re-measure the series when adding the next release.The reason found on the way: measurement was 32-way self-concurrent — 32 copies of a shape's binary at once, one per physical core, for 32 samples in one wall-clock pass. Measuring the same v0.8.0 binaries one at a time on a pinned core, box otherwise idle:
media_frame/json_encode— largest dataset, most allocation-heavy, exactly where contention should bite)That is not a constant offset that cancels out in cross-release comparison. It is a per-shape bias, so it distorts comparisons between shapes, which is what this matrix exists to support.
The series is therefore measured 1-up, with parallelism coming from several machines rather than several cores of one.
The backport
meshandcolumn_batchare measured back across every release. The harness belongs to the tooling rather than to any release, so shapes added late can still be measured retroactively — and it materially changes what v0.9.0's decode work looks like:packed_tile/decode(short arrays — the shape that existed at the time)column_batch/decode(long columns — what the work was actually for)column_batch/mergemesh/mergeJudged only on the shapes we happened to be tracking when it landed, that work would have been understated roughly threefold.
Each
historical-benchmark/vX.Y.Zbranch now carries the backported harness (pushed separately), so the new cells remain rebuildable — the design's reproducibility claim depends on it.A regression, recorded rather than buried
Two cells moved the wrong way and are not noise:
google_message1_proto3/decode_viewmedia_frame/decode_viewBoth -8.2% on spreads well under that.
google_message1_proto3has now declined two releases running, which clears the ±5% band the docs use to separate signal from noise. These are the two most message-dense shapes; the leading hypothesis is #250 (inline singular message fields), and owneddecodefor both stays inside the band (-1.8%, -2.4%) rather than falling with the view path, so it looks view-specific. Not root-caused — annotated so it isn't rediscovered from a chart later.run-series.shNew, and deliberately thin: it deals binaries across boxes and calls
bench-on-metal.shper binary rather than reimplementing the remote path. It retries provisioning across AZs (metal spot capacity was exhausted across three us-west-2 AZs during this run; it completed in us-east-2) and records instance ids so a crashed dispatcher still leaves a cleanup list.Verification
240 captures across 80 binaries (10 releases × 8 shapes × 3 runs), zero failures. Every number quoted above was computed from the committed run files before being written down — including one claim I had to correct, having written "flat-to-up" for a
decodepair that is actually -1.8%/-2.4%.