kitesurf · bench
Viewing archived run 2026-07-05 · commit be11786. 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
1250ms
2500ms
3750ms
5000ms
kitesurf · median 885ms · p95 2004ms · p99 2004ms container · median 354ms · p95 374ms · p99 374ms
Example Domain example-comkitesurf · median 1234ms · p95 2547ms · p99 2547ms container · median 698ms · p95 712ms · p99 712ms
Hacker News hacker-newskitesurf · median 3196ms · p95 3445ms · p99 3445ms container · median 871ms · p95 938ms · p99 938ms
Cloudflare Developer Docs cf-developerskitesurf · median 2567ms · p95 2647ms · p99 2647ms container · median 897ms · p95 911ms · p99 911ms
The Cloudflare Blog cf-blogkitesurf · median 2015ms · p95 2692ms · p99 2692ms container · median 778ms · p95 849ms · p99 849ms
Wikipedia Portal wikipedia-portalkitesurf · median 2836ms · p95 4671ms · p99 4671ms container · median 1645ms · p95 1696ms · p99 1696ms
Der Spiegel spiegelkitesurf · median 4171ms · p95 6854ms · p99 6854ms container · median 1505ms · p95 1585ms · p99 1585ms
El Mundo elmundokitesurf · median 1418ms · p95 1531ms · p99 1531ms container · median 412ms · p95 428ms · p99 428ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1457ms · p95 1623ms · p99 1623ms container · median 453ms · p95 460ms · p99 460ms
TodoMVC · React todomvc-reactkitesurf · median 1459ms · p95 1519ms · p99 1519ms container · median 495ms · p95 529ms · p99 529ms
TodoMVC · Vue todomvc-vuekitesurf · median 1511ms · p95 1819ms · p99 1819ms container · median 523ms · p95 817ms · p99 817ms
TodoMVC · Angular todomvc-angularkitesurf · median 944ms · p95 1486ms · p99 1486ms container · median 452ms · p95 556ms · p99 556ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 852ms · p95 1228ms · p99 1228ms container · median 154ms · p95 164ms · p99 164ms
Example Domain example-comkitesurf · median 1077ms · p95 1117ms · p99 1117ms container · median 511ms · p95 759ms · p99 759ms
Hacker News hacker-newskitesurf · median 3155ms · p95 6458ms · p99 6458ms container · median 643ms · p95 761ms · p99 761ms
Cloudflare Developer Docs cf-developerskitesurf · median 2553ms · p95 3057ms · p99 3057ms container · median 742ms · p95 796ms · p99 796ms
The Cloudflare Blog cf-blogkitesurf · median 1820ms · p95 2228ms · p99 2228ms container · median 486ms · p95 647ms · p99 647ms
Wikipedia Portal wikipedia-portalkitesurf · median 2786ms · p95 2823ms · p99 2823ms container · median 1563ms · p95 1670ms · p99 1670ms
Der Spiegel spiegelkitesurf · median 3021ms · p95 3946ms · p99 3946ms container · median 1109ms · p95 1196ms · p99 1196ms
El Mundo elmundokitesurf · median 1390ms · p95 1557ms · p99 1557ms container · median 270ms · p95 277ms · p99 277ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 946ms · p95 1496ms · p99 1496ms container · median 312ms · p95 333ms · p99 333ms
TodoMVC · React todomvc-reactkitesurf · median 1449ms · p95 1478ms · p99 1478ms container · median 320ms · p95 387ms · p99 387ms
TodoMVC · Vue todomvc-vuekitesurf · median 929ms · p95 1526ms · p99 1526ms container · median 325ms · p95 367ms · p99 367ms
TodoMVC · Angular todomvc-angularkitesurf · median 863ms · p95 1424ms · p99 1424ms container · median 233ms · p95 261ms · p99 261ms
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
1250ms
2500ms
3750ms
5000ms
kitesurf · median 84ms · p95 915ms · p99 915ms container · median 508ms · p95 537ms · p99 537ms
Example Domain example-comkitesurf · median 289ms · p95 594ms · p99 594ms container · median 696ms · p95 866ms · p99 866ms
Hacker News hacker-newskitesurf · median 709ms · p95 741ms · p99 741ms container · median 1872ms · p95 1952ms · p99 1952ms
Cloudflare Developer Docs cf-developerskitesurf · median 451ms · p95 471ms · p99 471ms container · median 2003ms · p95 2140ms · p99 2140ms
The Cloudflare Blog cf-blogkitesurf · median 615ms · p95 1031ms · p99 1031ms container · median 1734ms · p95 1965ms · p99 1965ms
Wikipedia Portal wikipedia-portalkitesurf · median 1315ms · p95 1806ms · p99 1806ms container · median 3343ms · p95 3436ms · p99 3436ms
Der Spiegel spiegelkitesurf · median 1680ms · p95 2882ms · p99 2882ms container · median 3931ms · p95 4181ms · p99 4181ms
El Mundo elmundokitesurf · median 110ms · p95 171ms · p99 171ms container · median 679ms · p95 748ms · p99 748ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 143ms · p95 149ms · p99 149ms container · median 781ms · p95 823ms · p99 823ms
TodoMVC · React todomvc-reactkitesurf · median 101ms · p95 159ms · p99 159ms container · median 879ms · p95 1029ms · p99 1029ms
TodoMVC · Vue todomvc-vuekitesurf · median 115ms · p95 161ms · p99 161ms container · median 922ms · p95 1079ms · p99 1079ms
TodoMVC · Angular todomvc-angularkitesurf · median 116ms · p95 170ms · p99 170ms container · median 736ms · p95 913ms · p99 913ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 53ms · p95 91ms · p99 91ms container · median 312ms · p95 339ms · p99 339ms
Example Domain example-comkitesurf · median 139ms · p95 161ms · p99 161ms container · median 544ms · p95 654ms · p99 654ms
Hacker News hacker-newskitesurf · median 606ms · p95 1576ms · p99 1576ms container · median 1320ms · p95 1658ms · p99 1658ms
Cloudflare Developer Docs cf-developerskitesurf · median 310ms · p95 486ms · p99 486ms container · median 1702ms · p95 1870ms · p99 1870ms
The Cloudflare Blog cf-blogkitesurf · median 406ms · p95 573ms · p99 573ms container · median 1088ms · p95 1392ms · p99 1392ms
Wikipedia Portal wikipedia-portalkitesurf · median 1273ms · p95 1311ms · p99 1311ms container · median 3220ms · p95 3387ms · p99 3387ms
Der Spiegel spiegelkitesurf · median 1663ms · p95 1960ms · p99 1960ms container · median 2889ms · p95 3068ms · p99 3068ms
El Mundo elmundokitesurf · median 66ms · p95 134ms · p99 134ms container · median 599ms · p95 609ms · p99 609ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 96ms · p95 98ms · p99 98ms container · median 642ms · p95 710ms · p99 710ms
TodoMVC · React todomvc-reactkitesurf · median 60ms · p95 61ms · p99 61ms container · median 685ms · p95 701ms · p99 701ms
TodoMVC · Vue todomvc-vuekitesurf · median 65ms · p95 69ms · p99 69ms container · median 689ms · p95 770ms · p99 770ms
TodoMVC · Angular todomvc-angularkitesurf · median 57ms · p95 60ms · p99 60ms container · median 478ms · p95 560ms · p99 560ms
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
0MiB
24MiB
48MiB
72MiB
95MiB
kitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 2MiB · p95 2MiB · p99 2MiB
Example Domain example-comkitesurf · median 16MiB · p95 16MiB · p99 16MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 33MiB · p95 33MiB · p99 33MiB container · median 4MiB · p95 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 33MiB · p95 33MiB · p99 33MiB container · median 3MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 32MiB · p95 32MiB · p99 32MiB container · median 3MiB · p95 6MiB · p99 6MiB
Wikipedia Portal wikipedia-portalkitesurf · median 69MiB · p95 103MiB · p99 103MiB container · median 9MiB · p95 9MiB · p99 9MiB
Der Spiegel spiegelkitesurf · median 40MiB · p95 66MiB · p99 66MiB container · median 9MiB · p95 9MiB · p99 9MiB
El Mundo elmundokitesurf · median 13MiB · p95 13MiB · p99 13MiB container · median 2MiB · p95 3MiB · p99 3MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 3MiB · p95 4MiB · p99 4MiB
TodoMVC · React todomvc-reactkitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 3MiB · p95 4MiB · p99 4MiB
TodoMVC · Vue todomvc-vuekitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 9MiB · p95 9MiB · p99 9MiB
TodoMVC · Angular todomvc-angularkitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · mem
0MiB
24MiB
48MiB
72MiB
95MiB
kitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 2MiB · p95 2MiB · p99 2MiB
Example Domain example-comkitesurf · median 9MiB · p95 9MiB · p99 9MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 31MiB · p95 31MiB · p99 31MiB container · median 4MiB · p95 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 33MiB · p95 33MiB · p99 33MiB container · median 3MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 32MiB · p95 32MiB · p99 32MiB container · median 3MiB · p95 4MiB · p99 4MiB
Wikipedia Portal wikipedia-portalkitesurf · median 70MiB · p95 70MiB · p99 70MiB container · median 9MiB · p95 9MiB · p99 9MiB
Der Spiegel spiegelkitesurf · median 38MiB · p95 38MiB · p99 38MiB container · median 9MiB · p95 9MiB · p99 9MiB
El Mundo elmundokitesurf · median 8MiB · p95 8MiB · p99 8MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 3MiB · p95 4MiB · p99 4MiB
TodoMVC · React todomvc-reactkitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 4MiB · p95 4MiB · p99 4MiB
TodoMVC · Vue todomvc-vuekitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 9MiB · p95 9MiB · p99 9MiB
TodoMVC · Angular todomvc-angularkitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
Run 2026-07-05 · 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-07-05.md
2026-07-05.json
history.json
badge.svg
# kitesurf bench report — 2026-07-05
commit: `be11786` · backends: kitesurf, container · endpoints: screenshot, html · runs/combo: 5 (+ 2 warmup)
target: https://kitesurf-bench.rendering.cfdata.org
> boa eval-less runtime — run page JS (Runtime.evaluate + dynamic import) without V8 code-gen-from-string @lduarte
## Summary (median wall time)
| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 846ms | 811ms | 437ms | 215ms |
| Hacker News | 1207ms | 1042ms | 828ms | 826ms |
| Cloudflare Developer Docs | 2680ms | 2709ms | 1008ms | 760ms |
| The Cloudflare Blog | 2166ms | 2293ms | 1001ms | 837ms |
| Wikipedia Portal | 1645ms | 1468ms | 915ms | 677ms |
| Der Spiegel | 1688ms | 1973ms | 1790ms | 1739ms |
| El Mundo | 3013ms | 2026ms | 1590ms | 1195ms |
| TodoMVC · JavaScript ES6 | 1266ms | 1329ms | 493ms | 343ms |
| TodoMVC · React | 1384ms | 811ms | 965ms | 388ms |
| TodoMVC · Vue | 1331ms | 1392ms | 564ms | 801ms |
| TodoMVC · Angular | 1389ms | 821ms | 868ms | 706ms |
| TodoMVC · Preact | 785ms | 758ms | 522ms | 643ms |
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