Performance

September 18, 2026 · View on GitHub

Current 2026-09-14 — Mac M5, wasmtime 47.0.1, examples/hello.wasm, n=1000 after 50 warmup (pool_vs_budget.py)

ScenarioWall medianWall p95Wall minGuest median
Pooled (io_budget_bytes=None)0.514 ms0.891 ms0.438 ms0.174 ms
Default (per-run engine, 64 MiB I/O budget)0.941 ms1.153 ms0.809 ms0.606 ms

Raw: benchmarks/results/2026-09-14/pool_vs_budget.json (measured:true)

Cold/warm + overhead 2026-09-14 — pov_benchmark.py, HELLO_WAT (max_fuel=100k), n=300 each, first run discarded

ModeGuest medianGuest p95Wall medianWall p95
Cold (fresh sandbox per run)0.590 ms0.957 ms0.994 ms1.447 ms
Warm (cached engine)0.550 ms0.791 ms0.926 ms1.313 ms

Sandbox overhead (warm wall median − guest median): 0.376 ms — fuel metering, epoch deadline, preopen grant, output capture. Raw: benchmarks/results/2026-09-14/pov_benchmark.json (cold_start_raw/warm_start_raw arrays included)

Fuel boundary 2026-09-14 (fuel_boundary.py, macOS arm64)

CPU: 13.0 fuel/iteration, R² = 1.000 (7 successful points, 100–1M iterations); exhaustion boundary at default 1M fuel: 76,923 CPU iterations / 49,181 fd_writes (1.50 MB). I/O: 226.4 fuel per 32-byte fd_write, R² = 1.000. Fuel counts are deterministic per module+platform but NOT comparable across platforms/wasmtime builds. Raw: benchmarks/results/2026-09-14/fuel_boundary.json.

2026-08-25 — Mac M5, wasmtime 47.0.1, HELLO_WAT, WASIConfig(max_fuel=100k)

Tail N=1000

ModeMedianP95P99P999MeanStdDev
Cell warm (pooled)0.117ms0.138ms0.151ms0.19ms0.120ms0.010ms
Cell cold0.121ms0.143ms0.171ms1.49ms0.125ms0.045ms
Raw: benchmarks/results/2026-08-25/09_tail_*.json (1000 raw_ms)

Two platforms 2026-08-06 (300 runs)

PlatformMedianP95P99MeanStdDev95% CI
Mac M50.55ms0.83ms0.98ms0.57ms0.28ms±0.03ms
DGX Spark GB107.70ms12.5ms13.3ms8.26ms3.10ms±0.35ms

vs Docker (2026-09-14, live, measured:true)

Mac M5, Docker daemon 28.5.1, docker run --rm cold start with minimal payload (warmup run excluded, n=100 per image via --docker-runs 100). Reproducible: python benchmarks/competitive_benchmark.py. Raw: benchmarks/results/2026-09-14/competitive_benchmark.json (docker_measured:true).

RuntimeMeanP95vs Cell cold (0.485 ms)
Docker python:3.12-slim185.89 ms215.50 ms383× slower
Docker node:24-alpine176.84 ms207.90 ms365× slower
Ephemora Cell cold0.485 ms0.670 msbaseline
Ephemora Cell warm0.432 ms0.704 ms430× faster than Docker python

Reading every multiplier on this page (all three vs-Docker sections): a container-cold-start vs. invoked-WASM comparison for this benchmark workload on this machine (Docker on macOS runs in a VM) — not a general claim that WASM is always faster than Docker. For Wasm-based container runtimes — a different integration path — an academic measurement reports ~51 % slower startup vs. Docker (Liu et al., ACM TOSEM 34(6), 2025, doi:10.1145/3712197).

vs Docker (2026-08-30, live, measured:true — historical reference)

Mac M5, Docker 28.5.1, docker run --rm cold start with minimal payload (warmup pull excluded, n=7 per image). Reproducible: python benchmarks/competitive_benchmark.py. Raw: benchmarks/results/2026-08-30/competitive_benchmark.json (docker_measured:true).

RuntimeMeanP95vs Cell cold (0.400 ms)
Docker python:3.12-slim170.63 ms179.50 ms427× slower
Docker node:24-alpine167.75 ms179.99 ms419× slower
Ephemora Cell cold0.400 ms0.572 msbaseline
Ephemora Cell warm0.376 ms0.494 ms454× faster than Docker python

vs Docker (2026-08-06, same Mac — historical reference)

Historical: the 2026-08-06 figures below predate the live-measurement workflow (no raw JSON was committed for that run). They are kept for continuity; the reproducible reference is the live 2026-09-14 table above.

RuntimeMeanMedianvs Cell
Docker python:3.12-slim126ms122ms191x slower
Docker node:24-alpine122ms118ms185x slower
Cell cold0.66ms0.55msbaseline
Cell warm0.55ms0.52ms

Overhead fair (same HELLO_WAT, 2026-08-25, n=300)

Cell warm 0.25ms vs pure WASI 0.027ms = 825% — 0.22ms for fuel, timeout, preopen, output cap. 10_overhead_fair.json

Fuel vs epoch vs wall-clock (2026-09-18, mechanism benchmark)

The three ways to stop a run, measured on three axes. Repro: python benchmarks/fuel_epoch_wall.py — evidence benchmarks/results/2026-09-18/07_fuel_epoch_wall.json (measured:true; macOS arm64, wasmtime 47.0.1 pinned — relative taxes are per-platform and a DIFFERENT measurement from the 0.376 ms per-call overhead above; never mixed).

AxisFuelEpochWall-clock (subprocess)
Mechanism tax (10M-iter mixed loop, n=30, raw wasmtime)+35.2%+1.4%n/a — kills the process
Stop point deterministic?yesfuel_consumed identical across 5 runs (1,000,000/1,000,000)no — ms-scale jitterno
Overshoot at T=0.1 s (n=20, median / p95 / max)n/a — instruction-exact stop at the budgetpooled: 10.0 / 10.1 / 10.5 ms · per-run: 5.3 / 6.3 / 6.4 ms53.9 / 59.0 / 59.2 ms (spawn + teardown dominate)
What it boundsguest CPU sharewall timeprocess lifetime — the only layer whose blast radius also survives an engine bug (see SECURITY.md, engine advisories)

Reading: fuel buys a deterministic, budget-exact stop point at a real tax; epoch is essentially free but time-based (the per-run timer variant is measurably tighter than the pooled 50 ms ticks); the subprocess wall is the coarsest stop. Cited anchor for the fuel tax — 28–40% (wasmtime#4109) — is corroborated by our own 35.2%: measured, not assumed.

Linux-native Docker row (CI evidence job)

The macOS Docker numbers above run inside the Docker Desktop VM (caveat stated inline). A weekly non-blocking CI job measures the same comparison on an ubuntu runner, where Docker is native: .github/workflows/benchmark-linux.yml (Mondays 06:00 UTC + manual dispatch; evidence as run artifact + step summary — main stays bot-commit-free). The canonical table gains Linux rows once the job has run; until then no Linux number is claimed here.

Agentic 2026-08-25 (n=500 pooled, fresh)

ScenarioMedianP95P99Mean
Code Review0.24ms0.29ms0.31ms0.28ms
Data Transform0.24ms0.27ms0.29ms0.24ms
Plugin Chain0.26ms0.28ms0.31ms0.28ms
Docker null (daemon off) — 143–154x from 2026-08-06 remain historical context; the reproducible docker reference is the live 2026-08-30 table above. Raw: 06_agentic_fresh_2026-08-25.json

Original Agentic 2026-08-06

ScenarioNaivePooledDockerSpeedup
Code Review0.84ms0.81ms119.9ms143x
Data Transform0.82ms0.81ms121.5ms148x
Plugin Chain0.79ms0.76ms121.7ms154x

Tail & Cost

p99 0.15ms p999 0.19ms warm (raw: 09_tail_*.json) — an SLA of <0.2 ms at p99.9 is sustainable. Cost density (engine ~14 MB warm + <1 MB per guest vs ~50 MB per Docker container, throughput in the 10M calls/h/core class, savings 100–350x) comes from a local cost-density run whose raw log is not committed (07_cost_density.log, gitignored) — treat it as an order-of-magnitude indicator, not committed evidence.