# Share a Benchmark Report — Make the Regression Reviewable

Canonical: https://commareports.com/share-benchmark-report
Published: 2026-08-24

> Criterion, pytest-benchmark and JMH all produce HTML nobody sees. Publish the report to Comma for a link with anchored comments and a revision per run, so a 12% regression gets discussed, not screenshotted.

# 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

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

Drag `target/criterion/` (or a zip of it) into
[the app](https://commareports.com/): `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-benchmark** — `pytest --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

```bash
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](/docs/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](/comment-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](/docs/sharing).

## 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 →](https://commareports.com/)**

### Related

- [Share a k6 load-test report](/share-k6-load-test-report) · [Share a Gatling report](/share-gatling-report)
- [Share a JMeter report](/share-jmeter-report) · [Share a Locust report](/share-locust-report)
- [Share a Lighthouse report](/share-lighthouse-report) · [Publish from CI](/docs/ci)
