# Bengal performance baselines

Generated by `benchmarks/generate_speedup_report.py` from the committed JSON baselines in `benchmarks/baselines/`. Regenerate after running `benchmark_gil_speedup.py --publish` and `benchmark_cross_ssg.py --publish`.

## Free-threading speedup (PYTHON_GIL=0 vs PYTHON_GIL=1)

Same free-threaded CPython 3.14t interpreter. Each build runs in a subprocess; the only variable is whether the GIL is disabled (`PYTHON_GIL=0`, true free-threading) or re-enabled (`PYTHON_GIL=1`). Speedup = GIL=1 wall time / GIL=0 wall time; **> 1.0x means free-threading is faster**.

- Interpreter: `3.14.2 free-threading build (main, Dec 17 2025, 21:08:58) [Clang 21.1.4 ]`
- Free-threaded build: `True`
- Runs per cell (median): `3`

| Archetype | Pages | GIL=0 (s) | GIL=1 (s) | GIL=0 pages/s | GIL=1 pages/s | Speedup |
|---|--:|--:|--:|--:|--:|--:|
| blog | 100 | 4.864 | 6.053 | 20.6 | 16.5 | 1.24x |
| blog | 1,000 | 56.307 | 109.210 | 17.8 | 9.2 | 1.94x |

### Per-phase wall time (GIL=0), largest scale per archetype

| Archetype | Pages | discovery | taxonomy | rendering | assets | postprocess |
|---|--:|--:|--:|--:|--:|--:|
| blog | 1,000 | 0.623 | 0.156 | 21.866 | 0.126 | 2.332 |

## Peak resident memory

_No baseline yet. Run:_ `python benchmarks/benchmark_peak_rss.py --publish` _(expected at benchmarks/baselines/peak_rss.json)_

## Cross-SSG cold build (Bengal vs Hugo)

Identical content, cold builds, median of N runs. Bengal runs on the free-threaded 3.14t interpreter (`PYTHON_GIL=0`); Hugo uses auto-generated minimal layouts. This row exists for transparency: Hugo (compiled Go) is the speed reference; Bengal's headline win is the free-threading table above, measured against its own GIL-enabled self.

| Pages | bengal (s) | hugo (s) |
|--:|--:|--:|
| 100 | 5.268 | 0.240 |

Throughput (pages/second):

| Pages | bengal | hugo |
|--:|--:|--:|
| 100 | 19 | 417 |

Skipped SSGs:

- **eleventy**: skipped (Node/npx toolchain; not comparable cold)
- **mkdocs**: not installed
- **pelican**: not installed
