Share a benchmark report

Every benchmarking tool worth using produces more than a number. Criterion gives you the sample distribution, the outlier count and a confidence interval. pytest-benchmark gives you a histogram. JMH gives you per-fork variance. All of it exists so you can tell a regression apart from a noisy CI runner.

And all of it gets thrown away at the moment of sharing, when someone pastes "12% slower" into a channel and the team argues about whether that is real.

Publish the report

cargo bench                      # → target/criterion/report/index.html

Drag target/criterion/ (or a zip of it) into the app: report/index.html becomes the report body, the per-benchmark pages and the SVG plots upload as assets, and the relative references are rewritten so the drill-down from the summary into a single benchmark still works.

Same shape for the others:

  • pytest-benchmarkpytest --benchmark-histogram=bench writes SVGs; wrap them in a page or publish the generated output directly.
  • JMH — export from the JMH Visualizer and publish the HTML.
  • hyperfine--export-markdown is one table; render it and publish the page with the sentence explaining what changed.

From CI, one URL per suite

curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html target/criterion/report/index.html \
        --arg title "Benchmarks — $GIT_SHA" '{title: $title, html: $html}')"

Every run appends a revision at the same URL. That is the part that changes the conversation: performance work is inherently a comparison over time, and a stable URL with history is the smallest possible version of a performance dashboard — no service to run, no metrics pipeline to own. See publishing from CI.

What the review layer adds

  • "This regressed with the allocator change, and we accepted it — see the memory numbers." Anchored to the benchmark it concerns, still there six months later. See commenting on HTML.
  • "The runner was shared for this build; rerun before you believe it." Recorded next to the result, not lost in a thread.
  • Access per report — private, team, domain-gated, or public if the numbers are a selling point. See the sharing model.

Limits

  • Entry HTML: 5 MB. Assets: 25 MB per file, 250 MB and 500 files total. A large Criterion suite generates a lot of SVGs — publish per benchmark group if you approach the file count.
  • Scripts run, sandboxed: allow-scripts, no allow-same-origin.
  • 60 requests/minute per token.

Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision history.

Publish a benchmark report →

Related