Skip to content

Benchmarks

Live time-series of fps measurements from scripts/run-benchmark.mjs driven by the Benchmark workflow on every push to packages/core/src/** plus a weekly Sunday cron.

The runner is headless Chromium with SwiftShader — the same baseline that produces the numbers in PERFORMANCE.md. Real-GPU runners outperform these numbers; we publish SwiftShader so the floor we promise (T6 in PRODUCT.md) is always more strict than what consumers actually see.

T6 floors

Node countFloorTarget
1,00060 fps60 fps
5,00030 fps60 fps
10,00030 fps30 fps

A PR that drops any tier below its floor is a release blocker. The workflow opens a T6 regression issue automatically on first detection.

Latest run

Loading…

Time-series — 10K node fps over time

How a regression gets caught

  1. CI runs node scripts/run-benchmark.mjs on the runner.
  2. The script measures and writes the result; if any size dropped below its T6 floor it exits non-zero.
  3. The workflow opens a GitHub issue labeled regression + benchmark + T6 linking to the failing run.
  4. The maintainer triages — either roll back the regressing commit or record a Tenet-exception in HISTORY.md if there's an explicit reason to accept the tradeoff.

Running the benchmark locally

bash
pnpm install -w -D playwright                    # one-time
pnpm exec playwright install chromium
node scripts/run-benchmark.mjs                   # measures + appends JSON + floor check
node scripts/run-benchmark.mjs --counts 1000     # custom sizes
node scripts/run-benchmark.mjs --no-write        # dry-run, stdout only

The script writes to docs/public/data/benchmarks.json so that the chart on this page picks it up on the next docs build / refresh.

Released under the MIT License.