From f5f8e3dd3034dc6fb49b2956e166eb38fac9b1ca Mon Sep 17 00:00:00 2001 From: Iain McGinniss <309153+iainmcgin@users.noreply.github.com> Date: Thu, 25 Jun 2026 23:35:00 +0000 Subject: [PATCH] benchmarks/history: add v0.8.0 data point MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Measured at the v0.8.0 tag (3e72fbb1) with the same isolated, aligned methodology as the rest of the series (toolchain 1.96.0, lto+cgu1, 64-byte block-aligned, 32-core median). Reproducibility branch: historical-benchmark/v0.8.0. The fast-utf8 default shows on decode_view for the string-heavy shapes — LogRecord 1429->1670 (+17%), AnalyticsEvent 205->249 (+21%). ApiResponse decode_view is flat under isolation; MediaFrame +3%. PackedTile's v0.7.1 +47% step persists; the AnalyticsEvent v0.4.0 encode/compute_size regression still holds. --- benchmarks/history/README.md | 2 +- benchmarks/history/REPORT.md | 160 ++++++------ benchmarks/history/annotations.md | 26 +- benchmarks/history/charts/compute_size.svg | 117 ++++----- benchmarks/history/charts/decode.svg | 141 ++++++----- benchmarks/history/charts/decode_view.svg | 117 ++++----- benchmarks/history/charts/encode.svg | 117 ++++----- benchmarks/history/charts/json_decode.svg | 149 +++++------ benchmarks/history/charts/json_encode.svg | 117 ++++----- benchmarks/history/charts/merge.svg | 149 +++++------ benchmarks/history/runs/v0.8.0.json | 271 +++++++++++++++++++++ 11 files changed, 851 insertions(+), 515 deletions(-) create mode 100644 benchmarks/history/runs/v0.8.0.json diff --git a/benchmarks/history/README.md b/benchmarks/history/README.md index 26048418..43cb6fd5 100644 --- a/benchmarks/history/README.md +++ b/benchmarks/history/README.md @@ -18,7 +18,7 @@ iteration are stored alongside, and each number is the **median across several cores** with its spread recorded (see below). The matrix is **dense**: every message shape is measured against every release -(v0.1.0–v0.7.1), not just from the release that first added it to the suite. A +(v0.1.0–v0.8.0), not just from the release that first added it to the suite. A shape is a property of the protobuf schema, not of any buffa version — buffa v0.1.0 could always decode a `MediaFrame`, we just never asked it to — so the canonical shapes and datasets are fed to each release's own codegen and every diff --git a/benchmarks/history/REPORT.md b/benchmarks/history/REPORT.md index 37dc5026..651243df 100644 --- a/benchmarks/history/REPORT.md +++ b/benchmarks/history/REPORT.md @@ -10,33 +10,33 @@ dataset changed size. See [README.md](README.md) for methodology and caveats. -- Releases: v0.1.0, v0.2.0, v0.3.0, v0.4.0, v0.5.0, v0.6.0, v0.7.0, v0.7.1 +- Releases: v0.1.0, v0.2.0, v0.3.0, v0.4.0, v0.5.0, v0.6.0, v0.7.0, v0.7.1, v0.8.0 - Machine: c7i.metal-24xl — Intel(R) Xeon(R) Platinum 8488C - Tuning: turbo_disabled=1, governor=performance, pin_core=distinct-physical-per-instance - Build profile: lto=true, codegen-units=1, per-message-isolated, 64-byte block-aligned (-align-all-nofallthru-blocks=6); measured 1-up (32-core self-concurrent) - Samples: median of 32 cores per release (per-benchmark spread in run files) -- Criterion: 0.5.1 · latest measured at 2026-06-21T02:18:01Z +- Criterion: 0.5.1 · latest measured at 2026-06-25T23:22:19Z ## Biggest movers (first tracked release → latest) | Benchmark | First | Latest | Change | Range | |-----------|------:|-------:|-------:|-------| -| PackedTile / decode_view | 175 | 257 | +47% | v0.1.0→v0.7.1 | -| ApiResponse / decode_view | 888 | 1,152 | +30% | v0.1.0→v0.7.1 | -| MediaFrame / decode_view | 45,228 | 50,769 | +12% | v0.1.0→v0.7.1 | -| AnalyticsEvent / merge | 144 | 154 | +7% | v0.1.0→v0.7.1 | -| ApiResponse / merge | 776 | 824 | +6% | v0.1.0→v0.7.1 | -| LogRecord / decode_view | 1,358 | 1,429 | +5% | v0.1.0→v0.7.1 | -| GoogleMessage1 / encode | 2,031 | 2,125 | +5% | v0.1.0→v0.7.1 | -| GoogleMessage1 / decode_view | 896 | 933 | +4% | v0.1.0→v0.7.1 | -| AnalyticsEvent / encode | 462 | 413 | −11% | v0.1.0→v0.7.1 | -| AnalyticsEvent / compute_size | 1,363 | 1,266 | −7% | v0.1.0→v0.7.1 | -| ApiResponse / compute_size | 8,026 | 7,502 | −7% | v0.1.0→v0.7.1 | -| PackedTile / json_encode | 386 | 373 | −3% | v0.1.0→v0.7.1 | -| GoogleMessage1 / json_decode | 418 | 405 | −3% | v0.1.0→v0.7.1 | -| MediaFrame / merge | 15,762 | 15,300 | −3% | v0.1.0→v0.7.1 | -| GoogleMessage1 / compute_size | 4,800 | 4,690 | −2% | v0.1.0→v0.7.1 | -| MediaFrame / decode | 12,200 | 11,951 | −2% | v0.1.0→v0.7.1 | +| ApiResponse / decode_view | 888 | 1,155 | +30% | v0.1.0→v0.8.0 | +| PackedTile / decode_view | 175 | 220 | +26% | v0.1.0→v0.8.0 | +| LogRecord / decode | 510 | 638 | +25% | v0.1.0→v0.8.0 | +| AnalyticsEvent / decode_view | 200 | 249 | +24% | v0.1.0→v0.8.0 | +| LogRecord / decode_view | 1,358 | 1,670 | +23% | v0.1.0→v0.8.0 | +| AnalyticsEvent / merge | 144 | 172 | +20% | v0.1.0→v0.8.0 | +| MediaFrame / decode_view | 45,228 | 52,150 | +15% | v0.1.0→v0.8.0 | +| LogRecord / json_decode | 468 | 539 | +15% | v0.1.0→v0.8.0 | +| AnalyticsEvent / encode | 462 | 416 | −10% | v0.1.0→v0.8.0 | +| GoogleMessage1 / decode_view | 896 | 828 | −8% | v0.1.0→v0.8.0 | +| AnalyticsEvent / compute_size | 1,363 | 1,266 | −7% | v0.1.0→v0.8.0 | +| ApiResponse / compute_size | 8,026 | 7,539 | −6% | v0.1.0→v0.8.0 | +| PackedTile / json_encode | 386 | 370 | −4% | v0.1.0→v0.8.0 | +| GoogleMessage1 / compute_size | 4,800 | 4,658 | −3% | v0.1.0→v0.8.0 | +| MediaFrame / compute_size | 262,072 | 256,328 | −2% | v0.1.0→v0.8.0 | +| ApiResponse / json_encode | 584 | 575 | −1% | v0.1.0→v0.8.0 | All throughput values are MiB/s; higher is better. @@ -46,92 +46,92 @@ All throughput values are MiB/s; higher is better. ![Binary decode](charts/decode.svg) -| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | -|---------|------:|------:|------:|------:|------:|------:|------:|------:| -| ApiResponse | 607 | 593 (−2%) | 592 (−0%) | 620 (+5%) | 619 (−0%) | 626 (+1%) | 624 (−0%) | 607 (−3%) | -| LogRecord | 510 | 520 (+2%) | 523 (+1%) | 522 (−0%) | 514 (−2%) | 515 (+0%) | 516 (+0%) | 525 (+2%) | -| AnalyticsEvent | 127 | 128 (+1%) | 129 (+0%) | 128 (−1%) | 129 (+0%) | 128 (−0%) | 129 (+0%) | 127 (−2%) | -| GoogleMessage1 | 605 | 581 (−4%) | 623 (+7%) | 627 (+1%) | 626 (−0%) | 624 (−0%) | 629 (+1%) | 606 (−4%) | -| MediaFrame | 12,200 | 12,148 (−0%) | 11,763 (−3%) | 12,072 (+3%) | 12,089 (+0%) | 11,591 (−4%) | 11,914 (+3%) | 11,951 (+0%) | -| PackedTile | 227 | 225 (−1%) | 227 (+1%) | 227 (−0%) | 226 (−0%) | 224 (−1%) | 224 (+0%) | 227 (+1%) | +| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | v0.8.0 | +|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:| +| ApiResponse | 607 | 593 (−2%) | 592 (−0%) | 620 (+5%) | 619 (−0%) | 626 (+1%) | 624 (−0%) | 607 (−3%) | 647 (+7%) | +| LogRecord | 510 | 520 (+2%) | 523 (+1%) | 522 (−0%) | 514 (−2%) | 515 (+0%) | 516 (+0%) | 525 (+2%) | 638 (+21%) | +| AnalyticsEvent | 127 | 128 (+1%) | 129 (+0%) | 128 (−1%) | 129 (+0%) | 128 (−0%) | 129 (+0%) | 127 (−2%) | 140 (+10%) | +| GoogleMessage1 | 605 | 581 (−4%) | 623 (+7%) | 627 (+1%) | 626 (−0%) | 624 (−0%) | 629 (+1%) | 606 (−4%) | 605 (−0%) | +| MediaFrame | 12,200 | 12,148 (−0%) | 11,763 (−3%) | 12,072 (+3%) | 12,089 (+0%) | 11,591 (−4%) | 11,914 (+3%) | 11,951 (+0%) | 12,889 (+8%) | +| PackedTile | 227 | 225 (−1%) | 227 (+1%) | 227 (−0%) | 226 (−0%) | 224 (−1%) | 224 (+0%) | 227 (+1%) | 225 (−1%) | ### Merge into existing ![Merge into existing](charts/merge.svg) -| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | -|---------|------:|------:|------:|------:|------:|------:|------:|------:| -| ApiResponse | 776 | 789 (+2%) | 807 (+2%) | 822 (+2%) | 827 (+1%) | 833 (+1%) | 827 (−1%) | 824 (−0%) | -| LogRecord | 747 | 765 (+2%) | 764 (−0%) | 759 (−1%) | 763 (+1%) | 762 (−0%) | 763 (+0%) | 759 (−1%) | -| AnalyticsEvent | 144 | 151 (+5%) | 145 (−4%) | 147 (+2%) | 149 (+1%) | 147 (−2%) | 150 (+3%) | 154 (+2%) | -| GoogleMessage1 | 885 | 859 (−3%) | 906 (+5%) | 914 (+1%) | 892 (−2%) | 904 (+1%) | 922 (+2%) | 888 (−4%) | -| MediaFrame | 15,762 | 15,646 (−1%) | 15,496 (−1%) | 15,437 (−0%) | 15,538 (+1%) | 15,386 (−1%) | 15,275 (−1%) | 15,300 (+0%) | -| PackedTile | 257 | 254 (−1%) | 266 (+5%) | 259 (−3%) | 262 (+1%) | 259 (−1%) | 264 (+2%) | 264 (+0%) | +| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | v0.8.0 | +|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:| +| ApiResponse | 776 | 789 (+2%) | 807 (+2%) | 822 (+2%) | 827 (+1%) | 833 (+1%) | 827 (−1%) | 824 (−0%) | 882 (+7%) | +| LogRecord | 747 | 765 (+2%) | 764 (−0%) | 759 (−1%) | 763 (+1%) | 762 (−0%) | 763 (+0%) | 759 (−1%) | 858 (+13%) | +| AnalyticsEvent | 144 | 151 (+5%) | 145 (−4%) | 147 (+2%) | 149 (+1%) | 147 (−2%) | 150 (+3%) | 154 (+2%) | 172 (+12%) | +| GoogleMessage1 | 885 | 859 (−3%) | 906 (+5%) | 914 (+1%) | 892 (−2%) | 904 (+1%) | 922 (+2%) | 888 (−4%) | 889 (+0%) | +| MediaFrame | 15,762 | 15,646 (−1%) | 15,496 (−1%) | 15,437 (−0%) | 15,538 (+1%) | 15,386 (−1%) | 15,275 (−1%) | 15,300 (+0%) | 16,475 (+8%) | +| PackedTile | 257 | 254 (−1%) | 266 (+5%) | 259 (−3%) | 262 (+1%) | 259 (−1%) | 264 (+2%) | 264 (+0%) | 253 (−4%) | ### Binary encode ![Binary encode](charts/encode.svg) -| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | -|---------|------:|------:|------:|------:|------:|------:|------:|------:| -| ApiResponse | 1,943 | 1,943 (+0%) | 1,929 (−1%) | 1,980 (+3%) | 1,974 (−0%) | 1,981 (+0%) | 1,975 (−0%) | 1,973 (−0%) | -| LogRecord | 3,058 | 3,057 (−0%) | 3,025 (−1%) | 2,964 (−2%) | 3,060 (+3%) | 3,105 (+1%) | 3,088 (−1%) | 3,085 (−0%) | -| AnalyticsEvent | 462 | 464 (+0%) | 468 (+1%) | 414 (−11%) | 414 (−0%) | 414 (−0%) | 416 (+1%) | 413 (−1%) | -| GoogleMessage1 | 2,031 | 2,020 (−1%) | 2,044 (+1%) | 2,047 (+0%) | 2,119 (+4%) | 2,129 (+0%) | 2,122 (−0%) | 2,125 (+0%) | -| MediaFrame | 25,445 | 25,465 (+0%) | 25,490 (+0%) | 25,511 (+0%) | 25,395 (−0%) | 25,446 (+0%) | 25,373 (−0%) | 25,427 (+0%) | -| PackedTile | 482 | 482 (+0%) | 481 (−0%) | 478 (−0%) | 480 (+0%) | 482 (+0%) | 482 (−0%) | 480 (−0%) | +| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | v0.8.0 | +|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:| +| ApiResponse | 1,943 | 1,943 (+0%) | 1,929 (−1%) | 1,980 (+3%) | 1,974 (−0%) | 1,981 (+0%) | 1,975 (−0%) | 1,973 (−0%) | 1,987 (+1%) | +| LogRecord | 3,058 | 3,057 (−0%) | 3,025 (−1%) | 2,964 (−2%) | 3,060 (+3%) | 3,105 (+1%) | 3,088 (−1%) | 3,085 (−0%) | 3,045 (−1%) | +| AnalyticsEvent | 462 | 464 (+0%) | 468 (+1%) | 414 (−11%) | 414 (−0%) | 414 (−0%) | 416 (+1%) | 413 (−1%) | 416 (+1%) | +| GoogleMessage1 | 2,031 | 2,020 (−1%) | 2,044 (+1%) | 2,047 (+0%) | 2,119 (+4%) | 2,129 (+0%) | 2,122 (−0%) | 2,125 (+0%) | 2,107 (−1%) | +| MediaFrame | 25,445 | 25,465 (+0%) | 25,490 (+0%) | 25,511 (+0%) | 25,395 (−0%) | 25,446 (+0%) | 25,373 (−0%) | 25,427 (+0%) | 25,565 (+1%) | +| PackedTile | 482 | 482 (+0%) | 481 (−0%) | 478 (−0%) | 480 (+0%) | 482 (+0%) | 482 (−0%) | 480 (−0%) | 481 (+0%) | ### Compute size ![Compute size](charts/compute_size.svg) -| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | -|---------|------:|------:|------:|------:|------:|------:|------:|------:| -| ApiResponse | 8,026 | 8,027 (+0%) | 7,943 (−1%) | 7,508 (−5%) | 7,577 (+1%) | 7,508 (−1%) | 7,507 (−0%) | 7,502 (−0%) | -| LogRecord | 9,439 | 9,356 (−1%) | 9,383 (+0%) | 9,348 (−0%) | 9,447 (+1%) | 9,486 (+0%) | 9,511 (+0%) | 9,496 (−0%) | -| AnalyticsEvent | 1,363 | 1,365 (+0%) | 1,379 (+1%) | 1,262 (−8%) | 1,270 (+1%) | 1,271 (+0%) | 1,267 (−0%) | 1,266 (−0%) | -| GoogleMessage1 | 4,800 | 4,790 (−0%) | 4,801 (+0%) | 4,803 (+0%) | 4,670 (−3%) | 4,693 (+0%) | 4,650 (−1%) | 4,690 (+1%) | -| MediaFrame | 262,072 | 261,862 (−0%) | 261,729 (−0%) | 259,589 (−1%) | 261,709 (+1%) | 261,524 (−0%) | 262,707 (+0%) | 262,451 (−0%) | -| PackedTile | 1,489 | 1,486 (−0%) | 1,486 (+0%) | 1,467 (−1%) | 1,476 (+1%) | 1,477 (+0%) | 1,477 (−0%) | 1,472 (−0%) | +| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | v0.8.0 | +|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:| +| ApiResponse | 8,026 | 8,027 (+0%) | 7,943 (−1%) | 7,508 (−5%) | 7,577 (+1%) | 7,508 (−1%) | 7,507 (−0%) | 7,502 (−0%) | 7,539 (+0%) | +| LogRecord | 9,439 | 9,356 (−1%) | 9,383 (+0%) | 9,348 (−0%) | 9,447 (+1%) | 9,486 (+0%) | 9,511 (+0%) | 9,496 (−0%) | 9,696 (+2%) | +| AnalyticsEvent | 1,363 | 1,365 (+0%) | 1,379 (+1%) | 1,262 (−8%) | 1,270 (+1%) | 1,271 (+0%) | 1,267 (−0%) | 1,266 (−0%) | 1,266 (−0%) | +| GoogleMessage1 | 4,800 | 4,790 (−0%) | 4,801 (+0%) | 4,803 (+0%) | 4,670 (−3%) | 4,693 (+0%) | 4,650 (−1%) | 4,690 (+1%) | 4,658 (−1%) | +| MediaFrame | 262,072 | 261,862 (−0%) | 261,729 (−0%) | 259,589 (−1%) | 261,709 (+1%) | 261,524 (−0%) | 262,707 (+0%) | 262,451 (−0%) | 256,328 (−2%) | +| PackedTile | 1,489 | 1,486 (−0%) | 1,486 (+0%) | 1,467 (−1%) | 1,476 (+1%) | 1,477 (+0%) | 1,477 (−0%) | 1,472 (−0%) | 1,472 (−0%) | ### View decode ![View decode](charts/decode_view.svg) -| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | -|---------|------:|------:|------:|------:|------:|------:|------:|------:| -| ApiResponse | 888 | 880 (−1%) | 1,145 (+30%) | 1,157 (+1%) | 1,156 (−0%) | 1,146 (−1%) | 1,158 (+1%) | 1,152 (−0%) | -| LogRecord | 1,358 | 1,376 (+1%) | 1,430 (+4%) | 1,442 (+1%) | 1,429 (−1%) | 1,393 (−2%) | 1,400 (+0%) | 1,429 (+2%) | -| AnalyticsEvent | 200 | 199 (−1%) | 203 (+2%) | 203 (+0%) | 202 (−0%) | 204 (+1%) | 203 (−1%) | 205 (+1%) | -| GoogleMessage1 | 896 | 898 (+0%) | 941 (+5%) | 939 (−0%) | 938 (−0%) | 938 (+0%) | 937 (−0%) | 933 (−0%) | -| MediaFrame | 45,228 | 45,181 (−0%) | 49,952 (+11%) | 49,475 (−1%) | 50,128 (+1%) | 49,891 (−0%) | 51,001 (+2%) | 50,769 (−0%) | -| PackedTile | 175 | 173 (−1%) | 177 (+2%) | 176 (−1%) | 177 (+1%) | 175 (−1%) | 176 (+0%) | 257 (+46%) | +| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | v0.8.0 | +|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:| +| ApiResponse | 888 | 880 (−1%) | 1,145 (+30%) | 1,157 (+1%) | 1,156 (−0%) | 1,146 (−1%) | 1,158 (+1%) | 1,152 (−0%) | 1,155 (+0%) | +| LogRecord | 1,358 | 1,376 (+1%) | 1,430 (+4%) | 1,442 (+1%) | 1,429 (−1%) | 1,393 (−2%) | 1,400 (+0%) | 1,429 (+2%) | 1,670 (+17%) | +| AnalyticsEvent | 200 | 199 (−1%) | 203 (+2%) | 203 (+0%) | 202 (−0%) | 204 (+1%) | 203 (−1%) | 205 (+1%) | 249 (+21%) | +| GoogleMessage1 | 896 | 898 (+0%) | 941 (+5%) | 939 (−0%) | 938 (−0%) | 938 (+0%) | 937 (−0%) | 933 (−0%) | 828 (−11%) | +| MediaFrame | 45,228 | 45,181 (−0%) | 49,952 (+11%) | 49,475 (−1%) | 50,128 (+1%) | 49,891 (−0%) | 51,001 (+2%) | 50,769 (−0%) | 52,150 (+3%) | +| PackedTile | 175 | 173 (−1%) | 177 (+2%) | 176 (−1%) | 177 (+1%) | 175 (−1%) | 176 (+0%) | 257 (+46%) | 220 (−14%) | ### JSON encode ![JSON encode](charts/json_encode.svg) -| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | -|---------|------:|------:|------:|------:|------:|------:|------:|------:| -| ApiResponse | 584 | 573 (−2%) | 574 (+0%) | 584 (+2%) | 582 (−0%) | 586 (+1%) | 577 (−1%) | 586 (+2%) | -| LogRecord | 876 | 886 (+1%) | 883 (−0%) | 879 (−1%) | 886 (+1%) | 881 (−1%) | 884 (+0%) | 881 (−0%) | -| AnalyticsEvent | 548 | 536 (−2%) | 544 (+2%) | 544 (+0%) | 549 (+1%) | 545 (−1%) | 545 (−0%) | 548 (+1%) | -| GoogleMessage1 | 645 | 649 (+1%) | 658 (+1%) | 655 (−0%) | 657 (+0%) | 642 (−2%) | 652 (+2%) | 653 (+0%) | -| MediaFrame | 689 | 725 (+5%) | 703 (−3%) | 702 (−0%) | 706 (+1%) | 703 (−0%) | 700 (−0%) | 706 (+1%) | -| PackedTile | 386 | 385 (−0%) | 384 (−0%) | 370 (−4%) | 373 (+1%) | 370 (−1%) | 371 (+0%) | 373 (+0%) | +| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | v0.8.0 | +|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:| +| ApiResponse | 584 | 573 (−2%) | 574 (+0%) | 584 (+2%) | 582 (−0%) | 586 (+1%) | 577 (−1%) | 586 (+2%) | 575 (−2%) | +| LogRecord | 876 | 886 (+1%) | 883 (−0%) | 879 (−1%) | 886 (+1%) | 881 (−1%) | 884 (+0%) | 881 (−0%) | 882 (+0%) | +| AnalyticsEvent | 548 | 536 (−2%) | 544 (+2%) | 544 (+0%) | 549 (+1%) | 545 (−1%) | 545 (−0%) | 548 (+1%) | 548 (+0%) | +| GoogleMessage1 | 645 | 649 (+1%) | 658 (+1%) | 655 (−0%) | 657 (+0%) | 642 (−2%) | 652 (+2%) | 653 (+0%) | 659 (+1%) | +| MediaFrame | 689 | 725 (+5%) | 703 (−3%) | 702 (−0%) | 706 (+1%) | 703 (−0%) | 700 (−0%) | 706 (+1%) | 710 (+0%) | +| PackedTile | 386 | 385 (−0%) | 384 (−0%) | 370 (−4%) | 373 (+1%) | 370 (−1%) | 371 (+0%) | 373 (+0%) | 370 (−1%) | ### JSON decode ![JSON decode](charts/json_decode.svg) -| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | -|---------|------:|------:|------:|------:|------:|------:|------:|------:| -| ApiResponse | 488 | 489 (+0%) | 488 (−0%) | 495 (+1%) | 476 (−4%) | 488 (+2%) | 491 (+1%) | 492 (+0%) | -| LogRecord | 468 | 482 (+3%) | 469 (−3%) | 462 (−1%) | 474 (+2%) | 465 (−2%) | 464 (−0%) | 484 (+4%) | -| AnalyticsEvent | 178 | 177 (−0%) | 178 (+0%) | 178 (+0%) | 179 (+0%) | 177 (−1%) | 178 (+1%) | 181 (+2%) | -| GoogleMessage1 | 418 | 405 (−3%) | 410 (+1%) | 402 (−2%) | 412 (+2%) | 400 (−3%) | 421 (+5%) | 405 (−4%) | -| MediaFrame | 1,229 | 1,220 (−1%) | 1,224 (+0%) | 1,229 (+0%) | 1,219 (−1%) | 1,221 (+0%) | 1,219 (−0%) | 1,224 (+0%) | -| PackedTile | 198 | 199 (+1%) | 200 (+1%) | 199 (−1%) | 195 (−2%) | 201 (+3%) | 202 (+0%) | 204 (+1%) | +| Message | v0.1.0 | v0.2.0 | v0.3.0 | v0.4.0 | v0.5.0 | v0.6.0 | v0.7.0 | v0.7.1 | v0.8.0 | +|---------|------:|------:|------:|------:|------:|------:|------:|------:|------:| +| ApiResponse | 488 | 489 (+0%) | 488 (−0%) | 495 (+1%) | 476 (−4%) | 488 (+2%) | 491 (+1%) | 492 (+0%) | 492 (−0%) | +| LogRecord | 468 | 482 (+3%) | 469 (−3%) | 462 (−1%) | 474 (+2%) | 465 (−2%) | 464 (−0%) | 484 (+4%) | 539 (+11%) | +| AnalyticsEvent | 178 | 177 (−0%) | 178 (+0%) | 178 (+0%) | 179 (+0%) | 177 (−1%) | 178 (+1%) | 181 (+2%) | 180 (−1%) | +| GoogleMessage1 | 418 | 405 (−3%) | 410 (+1%) | 402 (−2%) | 412 (+2%) | 400 (−3%) | 421 (+5%) | 405 (−4%) | 421 (+4%) | +| MediaFrame | 1,229 | 1,220 (−1%) | 1,224 (+0%) | 1,229 (+0%) | 1,219 (−1%) | 1,221 (+0%) | 1,219 (−0%) | 1,224 (+0%) | 1,224 (+0%) | +| PackedTile | 198 | 199 (+1%) | 200 (+1%) | 199 (−1%) | 195 (−2%) | 201 (+3%) | 202 (+0%) | 204 (+1%) | 202 (−1%) | ## Measurement spread (core-to-core) @@ -141,10 +141,10 @@ the operation's spread here is noise, not signal. | Operation | Median spread | p90 spread | Max | |-----------|--------------:|-----------:|----:| -| Binary decode | 2.3% | 6.9% | 27.2% | -| Merge into existing | 3.6% | 9.3% | 13.9% | -| Binary encode | 4.6% | 14.4% | 17.8% | -| Compute size | 2.1% | 3.6% | 4.6% | -| View decode | 3.9% | 7.2% | 12.7% | +| Binary decode | 2.4% | 7.5% | 27.2% | +| Merge into existing | 3.6% | 9.0% | 13.9% | +| Binary encode | 4.6% | 12.7% | 17.8% | +| Compute size | 2.1% | 3.6% | 5.7% | +| View decode | 3.9% | 6.9% | 12.7% | | JSON encode | 4.0% | 18.1% | 29.7% | -| JSON decode | 5.1% | 8.2% | 12.5% | +| JSON decode | 5.1% | 8.0% | 12.5% | diff --git a/benchmarks/history/annotations.md b/benchmarks/history/annotations.md index 908922a4..c91fa5e7 100644 --- a/benchmarks/history/annotations.md +++ b/benchmarks/history/annotations.md @@ -2,7 +2,7 @@ Why the numbers in [REPORT.md](REPORT.md) move. The data is a **dense, per-message-isolated, layout-normalized matrix**: every message shape is measured -against every release (v0.1.0–v0.7.1), each built with only its own decoder +against every release (v0.1.0–v0.8.0), each built with only its own decoder compiled, at the pinned toolchain (1.96.0), `lto=true, codegen-units=1`, and **64-byte block alignment** (`-Cllvm-args=-align-all-nofallthru-blocks=6`), median of 32 cores. See [DESIGN.md](DESIGN.md) for the system and [README.md](README.md) @@ -24,25 +24,33 @@ below. The per-operation "Measurement spread" table in [REPORT.md](REPORT.md) an the per-benchmark spread in `runs/*.json` remain the place to check how far a given number can be trusted. -## Headline cross-release findings (v0.1.0 → v0.7.1) +## Headline cross-release findings (v0.1.0 → v0.8.0) A movement counts as real if it is large *for its operation* and **persists** across -releases. Two findings stand, both now sitting on clean, flat baselines: - +releases. Three findings stand, each now sitting on a clean, flat baseline: + +- **`decode_view` +17–21% on string-heavy shapes at v0.8.0** — LogRecord 1429→1670, + AnalyticsEvent 205→249 MiB/s. This is the `fast-utf8` default landing: UTF-8 + validation in `borrow_str` switched from `core::str::from_utf8` to + `smoothutf8::verify_with_slack`, which skips the per-string tail copy whenever + the wire buffer continues past the field. ApiResponse `decode_view` is flat under + isolation (the strings there are dominated by other field kinds), and MediaFrame + is +3% (bytes-dominated; little string work). The owned `decode`/`merge` paths + move less because the same validation is a smaller fraction of cycles once + per-field allocation enters. - **AnalyticsEvent `encode` −12% / `compute_size` −9%** — a real regression. A step down at v0.4.0 (encode 468→414, compute_size 1379→1262 MiB/s) that holds flat - through v0.7.1. `compute_size` is the tightest operation and corroborates the + through v0.8.0. `compute_size` is the tightest operation and corroborates the `encode` figure, so the deeply nested, repeated-submessage shape genuinely lost ground on the owned encode/size paths — the one result worth investigating. - **PackedTile `decode_view` +47% at v0.7.1** — flat (~175 MiB/s) from v0.1.0 through v0.7.0, then a single-release jump to ~257 at v0.7.1, consistent with the - packed-varint reserve work in that release. A 47% step is well clear of noise; but - it is the latest release, so "persists" isn't confirmable yet. + packed-varint reserve work in that release; v0.8.0 confirms the step persists. -Everything else is flat across the eight releases — including all of `json_encode` / +Everything else is flat across the nine releases — including all of `json_encode` / `json_decode`, which now hold steady at their fast value (LogRecord `json_encode` ~880 MiB/s at every release, vs a 19% flap before normalization). buffa's core -paths did not regress; the reassuring headline is that eight releases of `decode`, +paths did not regress; the reassuring headline is that nine releases of `decode`, `merge`, and the JSON paths hold steady once layout is controlled. ## Layout normalization — why, and what it costs diff --git a/benchmarks/history/charts/compute_size.svg b/benchmarks/history/charts/compute_size.svg index 1c3b321b..ed66fd01 100644 --- a/benchmarks/history/charts/compute_size.svg +++ b/benchmarks/history/charts/compute_size.svg @@ -24,67 +24,74 @@ 110% v0.1.0 - v0.2.0 - v0.3.0 - v0.4.0 - v0.5.0 - v0.6.0 - v0.7.0 - v0.7.1 - + v0.2.0 + v0.3.0 + v0.4.0 + v0.5.0 + v0.6.0 + v0.7.0 + v0.7.1 + v0.8.0 + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + + + ApiResponse diff --git a/benchmarks/history/charts/decode.svg b/benchmarks/history/charts/decode.svg index c6930b3b..7125f507 100644 --- a/benchmarks/history/charts/decode.svg +++ b/benchmarks/history/charts/decode.svg @@ -10,81 +10,88 @@ .footnote { font-size: 11px; fill: #57606a; } - + Binary decode — throughput vs each message’s first release (%) 90% - 95% + 100% - 100% + 110% - 105% + 120% - 110% - + 130% + v0.1.0 - v0.2.0 - v0.3.0 - v0.4.0 - v0.5.0 - v0.6.0 - v0.7.0 - v0.7.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + v0.2.0 + v0.3.0 + v0.4.0 + v0.5.0 + v0.6.0 + v0.7.0 + v0.7.1 + v0.8.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ApiResponse diff --git a/benchmarks/history/charts/decode_view.svg b/benchmarks/history/charts/decode_view.svg index 399c0134..ab06e8b3 100644 --- a/benchmarks/history/charts/decode_view.svg +++ b/benchmarks/history/charts/decode_view.svg @@ -28,67 +28,74 @@ 150% v0.1.0 - v0.2.0 - v0.3.0 - v0.4.0 - v0.5.0 - v0.6.0 - v0.7.0 - v0.7.1 - + v0.2.0 + v0.3.0 + v0.4.0 + v0.5.0 + v0.6.0 + v0.7.0 + v0.7.1 + v0.8.0 + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + + + ApiResponse diff --git a/benchmarks/history/charts/encode.svg b/benchmarks/history/charts/encode.svg index bf6e8f3d..c57641e8 100644 --- a/benchmarks/history/charts/encode.svg +++ b/benchmarks/history/charts/encode.svg @@ -28,67 +28,74 @@ 110% v0.1.0 - v0.2.0 - v0.3.0 - v0.4.0 - v0.5.0 - v0.6.0 - v0.7.0 - v0.7.1 - + v0.2.0 + v0.3.0 + v0.4.0 + v0.5.0 + v0.6.0 + v0.7.0 + v0.7.1 + v0.8.0 + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + + + ApiResponse diff --git a/benchmarks/history/charts/json_decode.svg b/benchmarks/history/charts/json_decode.svg index 2c505596..deecb7d4 100644 --- a/benchmarks/history/charts/json_decode.svg +++ b/benchmarks/history/charts/json_decode.svg @@ -10,81 +10,92 @@ .footnote { font-size: 11px; fill: #57606a; } - + JSON decode — throughput vs each message’s first release (%) 90% - - 95% + + 95% + + 100% - 100% - - 105% + 105% + + 110% + + 115% - 110% - + 120% + v0.1.0 - v0.2.0 - v0.3.0 - v0.4.0 - v0.5.0 - v0.6.0 - v0.7.0 - v0.7.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + v0.2.0 + v0.3.0 + v0.4.0 + v0.5.0 + v0.6.0 + v0.7.0 + v0.7.1 + v0.8.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ApiResponse diff --git a/benchmarks/history/charts/json_encode.svg b/benchmarks/history/charts/json_encode.svg index 6c442dda..114025c1 100644 --- a/benchmarks/history/charts/json_encode.svg +++ b/benchmarks/history/charts/json_encode.svg @@ -24,67 +24,74 @@ 110% v0.1.0 - v0.2.0 - v0.3.0 - v0.4.0 - v0.5.0 - v0.6.0 - v0.7.0 - v0.7.1 - + v0.2.0 + v0.3.0 + v0.4.0 + v0.5.0 + v0.6.0 + v0.7.0 + v0.7.1 + v0.8.0 + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + + + ApiResponse diff --git a/benchmarks/history/charts/merge.svg b/benchmarks/history/charts/merge.svg index 453dd047..b8a800e0 100644 --- a/benchmarks/history/charts/merge.svg +++ b/benchmarks/history/charts/merge.svg @@ -10,81 +10,92 @@ .footnote { font-size: 11px; fill: #57606a; } - + Merge into existing — throughput vs each message’s first release (%) 90% - - 95% + + 95% + + 100% - 100% - - 105% + 105% + + 110% + + 115% - 110% - + 120% + v0.1.0 - v0.2.0 - v0.3.0 - v0.4.0 - v0.5.0 - v0.6.0 - v0.7.0 - v0.7.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + v0.2.0 + v0.3.0 + v0.4.0 + v0.5.0 + v0.6.0 + v0.7.0 + v0.7.1 + v0.8.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ApiResponse diff --git a/benchmarks/history/runs/v0.8.0.json b/benchmarks/history/runs/v0.8.0.json new file mode 100644 index 00000000..73f8f4a3 --- /dev/null +++ b/benchmarks/history/runs/v0.8.0.json @@ -0,0 +1,271 @@ +{ + "version": "v0.8.0", + "commit": "3e72fbb1ef8a7b0f84e6ea0409038c7996a92450", + "commit_date": "2026-06-25T21:54:40Z", + "measured_at": "2026-06-25T23:22:19Z", + "toolchain": "1.96.0", + "criterion": "0.5.1", + "build_profile": "lto=true, codegen-units=1, per-message-isolated, 64-byte block-aligned (-align-all-nofallthru-blocks=6); measured 1-up (32-core self-concurrent)", + "machine": { + "instance_type": "c7i.metal-24xl", + "kernel": "Linux 6.8.0-1057-aws #60~22.04.1-Ubuntu SMP Wed May 27 08:16:59 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux", + "cpu": "Intel(R) Xeon(R) Platinum 8488C", + "turbo_disabled": "1", + "governor": "performance", + "pin_core": "distinct-physical-per-instance" + }, + "benchmarks": { + "buffa/analytics_event/compute_size": { + "median_ns": 118900.0, + "throughput_mib_s": 1265.5616, + "samples": 32, + "throughput_spread_pct": 5.71 + }, + "buffa/analytics_event/decode": { + "median_ns": 1073500.0, + "throughput_mib_s": 140.17, + "samples": 32, + "throughput_spread_pct": 2.35 + }, + "buffa/analytics_event/decode_view": { + "median_ns": 604925.0, + "throughput_mib_s": 248.755, + "samples": 32, + "throughput_spread_pct": 2.28 + }, + "buffa/analytics_event/encode": { + "median_ns": 361845.0, + "throughput_mib_s": 415.865, + "samples": 32, + "throughput_spread_pct": 3.97 + }, + "buffa/analytics_event/json_decode": { + "median_ns": 1661400.0, + "throughput_mib_s": 179.58, + "samples": 32, + "throughput_spread_pct": 5.5 + }, + "buffa/analytics_event/json_encode": { + "median_ns": 543960.0, + "throughput_mib_s": 548.485, + "samples": 32, + "throughput_spread_pct": 3.57 + }, + "buffa/analytics_event/merge": { + "median_ns": 877060.0, + "throughput_mib_s": 171.57, + "samples": 32, + "throughput_spread_pct": 8.98 + }, + "buffa/api_response/compute_size": { + "median_ns": 815.28, + "throughput_mib_s": 7539.0464, + "samples": 32, + "throughput_spread_pct": 1.38 + }, + "buffa/api_response/decode": { + "median_ns": 9507.0, + "throughput_mib_s": 646.515, + "samples": 32, + "throughput_spread_pct": 17.48 + }, + "buffa/api_response/decode_view": { + "median_ns": 5321.3, + "throughput_mib_s": 1155.0208, + "samples": 32, + "throughput_spread_pct": 2.38 + }, + "buffa/api_response/encode": { + "median_ns": 3092.8, + "throughput_mib_s": 1987.328, + "samples": 32, + "throughput_spread_pct": 7.62 + }, + "buffa/api_response/json_decode": { + "median_ns": 21536.0, + "throughput_mib_s": 491.59, + "samples": 32, + "throughput_spread_pct": 2.61 + }, + "buffa/api_response/json_encode": { + "median_ns": 18401.5, + "throughput_mib_s": 575.32, + "samples": 32, + "throughput_spread_pct": 20.33 + }, + "buffa/api_response/merge": { + "median_ns": 6964.8, + "throughput_mib_s": 882.495, + "samples": 32, + "throughput_spread_pct": 2.8 + }, + "buffa/google_message1_proto3/compute_size": { + "median_ns": 46.6765, + "throughput_mib_s": 4658.3808, + "samples": 32, + "throughput_spread_pct": 1.82 + }, + "buffa/google_message1_proto3/decode": { + "median_ns": 359.645, + "throughput_mib_s": 604.595, + "samples": 32, + "throughput_spread_pct": 7.5 + }, + "buffa/google_message1_proto3/decode_view": { + "median_ns": 262.535, + "throughput_mib_s": 828.23, + "samples": 32, + "throughput_spread_pct": 4.75 + }, + "buffa/google_message1_proto3/encode": { + "median_ns": 103.185, + "throughput_mib_s": 2107.2896, + "samples": 32, + "throughput_spread_pct": 11.05 + }, + "buffa/google_message1_proto3/json_decode": { + "median_ns": 934.29, + "throughput_mib_s": 420.55, + "samples": 32, + "throughput_spread_pct": 7.97 + }, + "buffa/google_message1_proto3/json_encode": { + "median_ns": 596.025, + "throughput_mib_s": 659.23, + "samples": 32, + "throughput_spread_pct": 7.67 + }, + "buffa/google_message1_proto3/merge": { + "median_ns": 244.575, + "throughput_mib_s": 889.055, + "samples": 32, + "throughput_spread_pct": 2.83 + }, + "buffa/log_record/compute_size": { + "median_ns": 3133.65, + "throughput_mib_s": 9695.744, + "samples": 32, + "throughput_spread_pct": 1.45 + }, + "buffa/log_record/decode": { + "median_ns": 47649.5, + "throughput_mib_s": 637.64, + "samples": 32, + "throughput_spread_pct": 2.34 + }, + "buffa/log_record/decode_view": { + "median_ns": 18189.5, + "throughput_mib_s": 1670.4, + "samples": 32, + "throughput_spread_pct": 5.33 + }, + "buffa/log_record/encode": { + "median_ns": 9979.5, + "throughput_mib_s": 3044.5568, + "samples": 32, + "throughput_spread_pct": 2.56 + }, + "buffa/log_record/json_decode": { + "median_ns": 69229.5, + "throughput_mib_s": 539.08, + "samples": 32, + "throughput_spread_pct": 4.39 + }, + "buffa/log_record/json_encode": { + "median_ns": 42317.0, + "throughput_mib_s": 881.915, + "samples": 32, + "throughput_spread_pct": 8.31 + }, + "buffa/log_record/merge": { + "median_ns": 35426.5, + "throughput_mib_s": 857.635, + "samples": 32, + "throughput_spread_pct": 2.89 + }, + "buffa/media_frame/compute_size": { + "median_ns": 2075.8, + "throughput_mib_s": 256327.68, + "samples": 32, + "throughput_spread_pct": 2.86 + }, + "buffa/media_frame/decode": { + "median_ns": 41283.5, + "throughput_mib_s": 12888.576, + "samples": 32, + "throughput_spread_pct": 3.57 + }, + "buffa/media_frame/decode_view": { + "median_ns": 10203.0, + "throughput_mib_s": 52149.76, + "samples": 32, + "throughput_spread_pct": 6.77 + }, + "buffa/media_frame/encode": { + "median_ns": 20813.0, + "throughput_mib_s": 25564.672, + "samples": 32, + "throughput_spread_pct": 7.83 + }, + "buffa/media_frame/json_decode": { + "median_ns": 581805.0, + "throughput_mib_s": 1223.7824, + "samples": 32, + "throughput_spread_pct": 2.41 + }, + "buffa/media_frame/json_encode": { + "median_ns": 1002950.0, + "throughput_mib_s": 709.885, + "samples": 32, + "throughput_spread_pct": 1.29 + }, + "buffa/media_frame/merge": { + "median_ns": 32296.5, + "throughput_mib_s": 16475.136, + "samples": 32, + "throughput_spread_pct": 6.13 + }, + "buffa/packed_tile/compute_size": { + "median_ns": 195265.0, + "throughput_mib_s": 1472.0, + "samples": 32, + "throughput_spread_pct": 1.43 + }, + "buffa/packed_tile/decode": { + "median_ns": 1275900.0, + "throughput_mib_s": 225.275, + "samples": 32, + "throughput_spread_pct": 0.59 + }, + "buffa/packed_tile/decode_view": { + "median_ns": 1305250.0, + "throughput_mib_s": 220.215, + "samples": 32, + "throughput_spread_pct": 3.14 + }, + "buffa/packed_tile/encode": { + "median_ns": 598105.0, + "throughput_mib_s": 480.57, + "samples": 32, + "throughput_spread_pct": 2.35 + }, + "buffa/packed_tile/json_decode": { + "median_ns": 3897000.0, + "throughput_mib_s": 201.51, + "samples": 32, + "throughput_spread_pct": 6.02 + }, + "buffa/packed_tile/json_encode": { + "median_ns": 2122550.0, + "throughput_mib_s": 369.975, + "samples": 32, + "throughput_spread_pct": 3.61 + }, + "buffa/packed_tile/merge": { + "median_ns": 1135850.0, + "throughput_mib_s": 253.055, + "samples": 32, + "throughput_spread_pct": 5.89 + } + } +}