kitesurf · bench
Viewing archived run 2026-05-25 · commit caf5678. View latest →
Backend comparison — median wall time
One grouped bar per page, one bar per backend. Bar height = median wall time from the orchestrator's performance.now() span. Hover a bar for median/p95/p99. Missing or all-errored cells render as a thin grey stub.
screenshot · wall
0.0ms
625ms
1250ms
1875ms
2500ms
kitesurf · median 976ms · p95 1002ms · p99 1002ms container · median 220ms · p95 221ms · p99 221ms
Example Domain example-comkitesurf · median 1198ms · p95 1399ms · p99 1399ms container · median 551ms · p95 570ms · p99 570ms
Hacker News hacker-newskitesurf · median 1502ms · p95 1644ms · p99 1644ms container · median 549ms · p95 599ms · p99 599ms
Cloudflare Developer Docs cf-developerskitesurf · median 2079ms · p95 2146ms · p99 2146ms container · median 613ms · p95 783ms · p99 783ms
The Cloudflare Blog cf-blogkitesurf · median 1426ms · p95 1442ms · p99 1442ms container · median 502ms · p95 532ms · p99 532ms
Wikipedia Portal wikipedia-portalkitesurf · median 1059ms · p95 1955ms · p99 1955ms container · median 275ms · p95 314ms · p99 314ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1067ms · p95 1088ms · p99 1088ms container · median 304ms · p95 318ms · p99 318ms
TodoMVC · React todomvc-reactkitesurf · median 1072ms · p95 1175ms · p99 1175ms container · median 270ms · p95 312ms · p99 312ms
TodoMVC · Vue todomvc-vuekitesurf · median 1072ms · p95 2584ms · p99 2584ms container · median 287ms · p95 292ms · p99 292ms
TodoMVC · Angular todomvc-angularkitesurf · median 1078ms · p95 2332ms · p99 2332ms container · median 263ms · p95 524ms · p99 524ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
500ms
1000ms
1500ms
2000ms
kitesurf · median 940ms · p95 969ms · p99 969ms container · median 95ms · p95 98ms · p99 98ms
Example Domain example-comkitesurf · median 1034ms · p95 1157ms · p99 1157ms container · median 409ms · p95 672ms · p99 672ms
Hacker News hacker-newskitesurf · median 1224ms · p95 3146ms · p99 3146ms container · median 378ms · p95 451ms · p99 451ms
Cloudflare Developer Docs cf-developerskitesurf · median 1624ms · p95 1722ms · p99 1722ms container · median 445ms · p95 534ms · p99 534ms
The Cloudflare Blog cf-blogkitesurf · median 1179ms · p95 1267ms · p99 1267ms container · median 284ms · p95 313ms · p99 313ms
Wikipedia Portal wikipedia-portalkitesurf · median 983ms · p95 1001ms · p99 1001ms container · median 130ms · p95 155ms · p99 155ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 758ms · p95 2185ms · p99 2185ms container · median 164ms · p95 166ms · p99 166ms
TodoMVC · React todomvc-reactkitesurf · median 979ms · p95 1030ms · p99 1030ms container · median 150ms · p95 177ms · p99 177ms
TodoMVC · Vue todomvc-vuekitesurf · median 1035ms · p95 2624ms · p99 2624ms container · median 191ms · p95 215ms · p99 215ms
TodoMVC · Angular todomvc-angularkitesurf · median 1000ms · p95 2296ms · p99 2296ms container · median 120ms · p95 150ms · p99 150ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
Backend comparison — median backend CPU time
Server-side CPU per call. Kitesurf reports $workers.cpuTimeMs from Workers Observability; container reports Node-side CPU via timing headers. Browser-run doesn't expose a CPU counter — bars render as a grey stub.
screenshot · cpu
0.0ms
500ms
1000ms
1500ms
2000ms
kitesurf · median 378ms · p95 391ms · p99 391ms container · median 296ms · p95 320ms · p99 320ms
Example Domain example-comkitesurf · median 463ms · p95 539ms · p99 539ms container · median 445ms · p95 522ms · p99 522ms
Hacker News hacker-newskitesurf · median 700ms · p95 784ms · p99 784ms container · median 1182ms · p95 1261ms · p99 1261ms
Cloudflare Developer Docs cf-developerskitesurf · median 651ms · p95 678ms · p99 678ms container · median 1125ms · p95 1217ms · p99 1217ms
The Cloudflare Blog cf-blogkitesurf · median 708ms · p95 736ms · p99 736ms container · median 1124ms · p95 1263ms · p99 1263ms
Wikipedia Portal wikipedia-portalkitesurf · median 406ms · p95 413ms · p99 413ms container · median 480ms · p95 601ms · p99 601ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 436ms · p95 458ms · p99 458ms container · median 518ms · p95 554ms · p99 554ms
TodoMVC · React todomvc-reactkitesurf · median 403ms · p95 435ms · p99 435ms container · median 468ms · p95 564ms · p99 564ms
TodoMVC · Vue todomvc-vuekitesurf · median 397ms · p95 412ms · p99 412ms container · median 483ms · p95 598ms · p99 598ms
TodoMVC · Angular todomvc-angularkitesurf · median 402ms · p95 438ms · p99 438ms container · median 437ms · p95 542ms · p99 542ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
250ms
500ms
750ms
1000ms
kitesurf · median 344ms · p95 354ms · p99 354ms container · median 185ms · p95 191ms · p99 191ms
Example Domain example-comkitesurf · median 309ms · p95 386ms · p99 386ms container · median 352ms · p95 380ms · p99 380ms
Hacker News hacker-newskitesurf · median 441ms · p95 537ms · p99 537ms container · median 796ms · p95 940ms · p99 940ms
Cloudflare Developer Docs cf-developerskitesurf · median 508ms · p95 519ms · p99 519ms container · median 730ms · p95 1047ms · p99 1047ms
The Cloudflare Blog cf-blogkitesurf · median 467ms · p95 556ms · p99 556ms container · median 639ms · p95 663ms · p99 663ms
Wikipedia Portal wikipedia-portalkitesurf · median 357ms · p95 371ms · p99 371ms container · median 273ms · p95 364ms · p99 364ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 240ms · p95 466ms · p99 466ms container · median 345ms · p95 397ms · p99 397ms
TodoMVC · React todomvc-reactkitesurf · median 357ms · p95 368ms · p99 368ms container · median 316ms · p95 431ms · p99 431ms
TodoMVC · Vue todomvc-vuekitesurf · median 360ms · p95 413ms · p99 413ms container · median 388ms · p95 418ms · p99 418ms
TodoMVC · Angular todomvc-angularkitesurf · median 360ms · p95 393ms · p99 393ms container · median 245ms · p95 299ms · p99 299ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
Backend comparison — median memory
Per-page memory at end of render. The two backends report different things — bars are directionally comparable, not strictly apples-to-apples.
kitesurf : kitesurf_core wasm linear memory size (WebAssembly.Memory.buffer.byteLength via Kitesurf.getMemoryStats). The wasm heap covers everything the renderer uses — DOM, parley, vello, stylo, image decode, screenshot raster — but it's a coarse high-water proxy: Rust's dlmalloc grows in chunks and doesn't release back to the OS, so the reading reflects peak demand rather than bytes-in-use. Per-render: each navigate gets a fresh isolate.
container : per-page memory from CDP Runtime.getHeapUsage (the same RPC DevTools' Memory panel uses), captured right after the page's load pipeline finishes — before V8's idle-time GC compacts the arenas. The value is totalSize (V8 heap arena) + embedderHeapUsedSize (Blink's native state: DOM, layout, image cache, style data) + backingStorageSize (ArrayBuffer / typed-array backings), matching DevTools' "Total JS heap size" for a live page. Doesn't cover GPU buffers or other renderer state outside Blink's embedder heap.
In short: kitesurf overcounts (high-water peak across the whole renderer); container undercounts (JS heap only). The truth for either backend lives somewhere between the two columns.
screenshot · mem
no recorded data for screenshot.
html · mem
no recorded data for html.
Run 2026-05-25 · per-metric tables
Same layout as npm run bench: per endpoint, tables for wall, cpu, mem. Each backend's median/p95/p99 side by side. ks = kitesurf, br = browser-run, ct = container. — = backend doesn't report this metric. err = every recorded run for that combination errored. See the memory chart's caption above for the per-backend metric semantics.
History
date
commit
kitesurf · screenshot kitesurf · html container · screenshot container · html
note
2026-07-11 17:46 15ac2dc1195ms 1488ms 884ms 589ms
2026-07-05 14:03 be117861645ms 1468ms 915ms 677ms boa eval-less runtime — run page JS (Runtime.evaluate + dynamic import) without V8 code-gen-from-string @lduarte
2026-07-02 00:36 1f76dfb560ms 547ms 696ms 512ms Reduce wasm peak memory ~23% (emoji SVG-strip + node-slab pre-size + lazy serif) @lduarte
2026-06-15 10:36 78edd791008ms 996ms 683ms 473ms
2026-06-06 10:28 9afdd69727ms 1457ms 778ms 548ms
2026-06-05 15:46 c8a9da7715ms 597ms 1080ms 920ms Refactor autoresearch for memory optimization + port wasm-memprof + autoresearch memory opts @lduarte
2026-06-05 15:34 c8a9da7715ms 597ms 1080ms 920ms Refactor autoresearch for memory optimization + port wasm-memprof + autoresearch memory opts @lduarte
2026-06-02 09:15 36cc68a950ms 1060ms 858ms 572ms
2026-06-02 00:32 bc688751088ms 1234ms 734ms 520ms
2026-06-02 00:15 84bf4a3835ms 1360ms 521ms 356ms
2026-06-02 00:04 885052c923ms 1079ms 693ms 505ms
2026-06-01 23:56 d1fa08a1173ms 1182ms 879ms 480ms
2026-06-01 23:30 4e0f0e71358ms 1181ms 697ms 460ms
2026-05-31 19:29 cd6a6d51109ms 869ms 864ms 610ms
2026-05-25 22:39 caf5678633ms 658ms 608ms 369ms rerun with concurrent-producer wallMs fix
2026-05-25 21:37 a4d9bf51442ms 1151ms 741ms 410ms tail-worker CPU attribution: now includes page-script wasm/JS cost
2026-05-25 11:48 04351641359ms 1194ms 916ms 618ms
2026-05-25 11:48 04351641362ms 1160ms 823ms 714ms
2026-05-25 11:48 04351641215ms 1020ms 704ms 487ms
2026-05-25 11:48 04351641172ms 925ms 706ms 394ms
Archived report (markdown)
2026-05-25.md
2026-05-25.json
history.json
badge.svg
# kitesurf bench report — 2026-05-25
commit: `caf5678` · backends: kitesurf, container · endpoints: screenshot, html · runs/combo: 5 (+ 2 warmup)
target: https://kitesurf-bench.rendering.cfdata.org
> rerun with concurrent-producer wallMs fix
## Summary (median wall time)
| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 526ms | 520ms | 274ms | 154ms |
| Hacker News | 662ms | 653ms | 672ms | 480ms |
| Cloudflare Developer Docs | 760ms | 746ms | 645ms | 449ms |
| The Cloudflare Blog | 1507ms | 1188ms | 741ms | 514ms |
| Wikipedia Portal | 633ms | 658ms | 608ms | 369ms |
| TodoMVC · JavaScript ES6 | 581ms | 545ms | 358ms | 183ms |
| TodoMVC · React | 567ms | 438ms | 365ms | 218ms |
| TodoMVC · Vue | 585ms | 572ms | 352ms | 202ms |
| TodoMVC · Angular | 599ms | 597ms | 349ms | 243ms |
| TodoMVC · Preact | 558ms | 571ms | 348ms | 188ms |
Notes:
- Values are run medians across recorded runs. p95 and min/max are in the JSON.
- Backends are dispatched from inside the `kitesurf-bench` worker via RPC bindings: `env.KITESURF.fetch(/screenshot|/html)` for kitesurf (service binding to the engine), `env.BROWSER.quickAction('screenshot'|'content', …)` for browser-run (Browser Rendering RPC), and `env.CONTAINER_HOST.fetch(…)` for container (sibling worker fronting its container backend). Wall time is the orchestrator's `performance.now()` span; `backendWallMs` / `backendCpuMs` in the JSON come from Workers Observability (kitesurf) or container-side timing headers (container). None of the measurement paths traverse the public internet.
- A cell shows `—` when every recorded run for that combination errored. See `rows` in the JSON for individual failure messages.
bundle built 2026-07-11T17:46:18.286Z