Steno benchmark report
This report is generated by deno task bench:report. Treat the numbers as evidence from one
machine, not a universal guarantee - if you're comparing runs, make sure they're on equivalent
hardware and runtime versions.
Environment
- Generated: 2026-08-07T09:15:01.920Z
- Revision: 90b2aa2fbf9d
- Working tree: clean
- Runtime: Deno/2.9.4 aarch64-apple-darwin
- OS: darwin 25.5.0
- Architecture: aarch64
- Logical CPUs: 10
- System memory: 16.0 GiB
Build scenarios
| Scenario | Samples | Min | Average | p75 | p99 |
|---|---|---|---|---|---|
| build (cold, 250 pages) | 21 | 25.77 ms | 26.82 ms | 26.85 ms | 31.77 ms |
| build (cold, 1000 pages) | 13 | 100.69 ms | 101.89 ms | 102.33 ms | 103.52 ms |
| build (cold, 4000 pages) | 11 | 397.86 ms | 404.63 ms | 405.97 ms | 417.09 ms |
| build (warm, 1000 pages unchanged) | 26 | 30.88 ms | 31.59 ms | 31.76 ms | 33.03 ms |
| build (atomic incremental, 1 changed page of 1000) | 13 | 224.92 ms | 232.12 ms | 231.89 ms | 252.42 ms |
Cold scenarios delete the output and persistent cache before every measured build. Warm unchanged starts from an already-initialized 1,000-page site. Atomic incremental changes one page while keeping transactional staging and promotion in place. Fixture creation happens outside the timer.
Parser and template microbenchmarks
| Scenario | Samples | Min | Average | p75 | p99 |
|---|---|---|---|---|---|
| parseFrontmatter (body only) | 14454 | 3.21 ns | 3.46 ns | 3.46 ns | 4.00 ns |
| parseFrontmatter (yaml + 10k-word body) | 72 | 808.77 ns | 817.77 ns | 819.56 ns | 870.20 ns |
| parseFrontmatter (yaml) | 37 | 1.85 µs | 1.87 µs | 1.88 µs | 1.92 µs |
| parseFrontmatter (toml) | 26 | 3.15 µs | 3.18 µs | 3.19 µs | 3.37 µs |
| parseFrontmatter (invalid yaml fails fast) | 38857 | 11.33 µs | 12.87 µs | 13.21 µs | 14.50 µs |
| parseFrontmatter (missing closing delimiter) | 3115 | 14.78 ns | 16.11 ns | 16.41 ns | 18.07 ns |
| pipeline (typical page parse->markdown->tau) | 5372 | 82.79 µs | 93.25 µs | 93.83 µs | 124.58 µs |
| pipeline (large page parse->markdown->tau) | 1165 | 406.04 µs | 433.19 µs | 436.96 µs | 493.54 µs |
| tau render (simple) | 66 | 874.82 ns | 901.51 ns | 908.10 ns | 1.08 µs |
| tau render (components + loops) | 55778 | 7.75 µs | 8.97 µs | 8.92 µs | 13.13 µs |
| tau render (list of 1000 items) | 744 | 643.46 µs | 682.31 µs | 691.21 µs | 745.54 µs |
| tau render (4-level nested loops) | 448 | 1.09 ms | 1.14 ms | 1.16 ms | 1.45 ms |
| tau render (unclosed tag fails fast) | 71114 | 6.25 µs | 7.03 µs | 7.08 µs | 7.67 µs |
Reproduce
deno task bench:report
deno task bench:check
deno task bench:trends
Run this on an otherwise idle machine. The performance gate checks averages against committed
budgets; this report also publishes sample count, minimum, p75, and p99 latency for the curious.
The trends command stores its local history under benchmarks/.bench-history, compares each run
with the last accepted baseline, and exits unsuccessfully when an average regresses by more than
20%. Set STENO_BENCH_TREND_THRESHOLD to a non-negative ratio to override that limit locally.