kitesurf · bench
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
2500ms
5000ms
7500ms
10000ms
kitesurf · median 886ms · p95 3154ms · p99 3154ms container · median 323ms · p95 342ms · p99 342ms
Example Domain example-comkitesurf · median 1202ms · p95 1527ms · p99 1527ms container · median 718ms · p95 1081ms · p99 1081ms
Hacker News hacker-newskitesurf · median 4019ms · p95 10869ms · p99 10869ms container · median 756ms · p95 801ms · p99 801ms
Cloudflare Developer Docs cf-developerskitesurf · median 2201ms · p95 2926ms · p99 2926ms container · median 941ms · p95 966ms · p99 966ms
The Cloudflare Blog cf-blogkitesurf · median 2159ms · p95 6200ms · p99 6200ms container · median 736ms · p95 781ms · p99 781ms
Wikipedia Portal wikipedia-portalkitesurf · median 5385ms · p95 6156ms · p99 6156ms container · median 1695ms · p95 1860ms · p99 1860ms
Der Spiegel spiegelkitesurf · median 7139ms · p95 7538ms · p99 7538ms container · median 1515ms · p95 1704ms · p99 1704ms
El Mundo elmundokitesurf · median 1074ms · p95 1536ms · p99 1536ms container · median 476ms · p95 492ms · p99 492ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1589ms · p95 1726ms · p99 1726ms container · median 453ms · p95 477ms · p99 477ms
TodoMVC · React todomvc-reactkitesurf · median 1241ms · p95 2086ms · p99 2086ms container · median 435ms · p95 479ms · p99 479ms
TodoMVC · Vue todomvc-vuekitesurf · median 1160ms · p95 2677ms · p99 2677ms container · median 524ms · p95 614ms · p99 614ms
TodoMVC · Angular todomvc-angularkitesurf · median 1014ms · p95 2628ms · p99 2628ms container · median 476ms · p95 487ms · p99 487ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
2500ms
5000ms
7500ms
10000ms
kitesurf · median 853ms · p95 1648ms · p99 1648ms container · median 169ms · p95 207ms · p99 207ms
Example Domain example-comkitesurf · median 1162ms · p95 1858ms · p99 1858ms container · median 511ms · p95 800ms · p99 800ms
Hacker News hacker-newskitesurf · median 4017ms · p95 6969ms · p99 6969ms container · median 634ms · p95 686ms · p99 686ms
Cloudflare Developer Docs cf-developerskitesurf · median 2022ms · p95 2107ms · p99 2107ms container · median 729ms · p95 743ms · p99 743ms
The Cloudflare Blog cf-blogkitesurf · median 2159ms · p95 2274ms · p99 2274ms container · median 511ms · p95 600ms · p99 600ms
Wikipedia Portal wikipedia-portalkitesurf · median 5627ms · p95 6610ms · p99 6610ms container · median 1659ms · p95 1706ms · p99 1706ms
Der Spiegel spiegelkitesurf · median 3760ms · p95 5530ms · p99 5530ms container · median 1127ms · p95 1217ms · p99 1217ms
El Mundo elmundokitesurf · median 953ms · p95 1629ms · p99 1629ms container · median 240ms · p95 329ms · p99 329ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1018ms · p95 2589ms · p99 2589ms container · median 265ms · p95 287ms · p99 287ms
TodoMVC · React todomvc-reactkitesurf · median 971ms · p95 2138ms · p99 2138ms container · median 339ms · p95 395ms · p99 395ms
TodoMVC · Vue todomvc-vuekitesurf · median 1048ms · p95 1474ms · p99 1474ms container · median 343ms · p95 395ms · p99 395ms
TodoMVC · Angular todomvc-angularkitesurf · median 951ms · p95 1478ms · p99 1478ms container · median 221ms · p95 255ms · p99 255ms
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 72ms · p95 1355ms · p99 1355ms container · median 496ms · p95 523ms · p99 523ms
Example Domain example-comkitesurf · median 235ms · p95 250ms · p99 250ms container · median 712ms · p95 837ms · p99 837ms
Hacker News hacker-newskitesurf · median 1122ms · p95 1373ms · p99 1373ms container · median 1605ms · p95 1700ms · p99 1700ms
Cloudflare Developer Docs cf-developerskitesurf · median 595ms · p95 614ms · p99 614ms container · median 2139ms · p95 2204ms · p99 2204ms
The Cloudflare Blog cf-blogkitesurf · median 975ms · p95 1398ms · p99 1398ms container · median 1571ms · p95 1716ms · p99 1716ms
Wikipedia Portal wikipedia-portalkitesurf · median 4063ms · p95 4747ms · p99 4747ms container · median 3611ms · p95 3673ms · p99 3673ms
Der Spiegel spiegelkitesurf · median 4353ms · p95 4448ms · p99 4448ms container · median 3917ms · p95 4344ms · p99 4344ms
El Mundo elmundokitesurf · median 146ms · p95 157ms · p99 157ms container · median 834ms · p95 846ms · p99 846ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 178ms · p95 181ms · p99 181ms container · median 762ms · p95 845ms · p99 845ms
TodoMVC · React todomvc-reactkitesurf · median 136ms · p95 256ms · p99 256ms container · median 782ms · p95 852ms · p99 852ms
TodoMVC · Vue todomvc-vuekitesurf · median 147ms · p95 264ms · p99 264ms container · median 943ms · p95 1109ms · p99 1109ms
TodoMVC · Angular todomvc-angularkitesurf · median 158ms · p95 251ms · p99 251ms container · median 807ms · p95 928ms · p99 928ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 45ms · p95 146ms · p99 146ms container · median 346ms · p95 475ms · p99 475ms
Example Domain example-comkitesurf · median 158ms · p95 525ms · p99 525ms container · median 506ms · p95 629ms · p99 629ms
Hacker News hacker-newskitesurf · median 854ms · p95 984ms · p99 984ms container · median 1356ms · p95 1474ms · p99 1474ms
Cloudflare Developer Docs cf-developerskitesurf · median 408ms · p95 418ms · p99 418ms container · median 1612ms · p95 1647ms · p99 1647ms
The Cloudflare Blog cf-blogkitesurf · median 746ms · p95 787ms · p99 787ms container · median 1150ms · p95 1435ms · p99 1435ms
Wikipedia Portal wikipedia-portalkitesurf · median 4215ms · p95 4815ms · p99 4815ms container · median 3268ms · p95 3510ms · p99 3510ms
Der Spiegel spiegelkitesurf · median 2340ms · p95 2955ms · p99 2955ms container · median 2841ms · p95 3126ms · p99 3126ms
El Mundo elmundokitesurf · median 81ms · p95 98ms · p99 98ms container · median 527ms · p95 826ms · p99 826ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 137ms · p95 352ms · p99 352ms container · median 603ms · p95 678ms · p99 678ms
TodoMVC · React todomvc-reactkitesurf · median 84ms · p95 171ms · p99 171ms container · median 744ms · p95 853ms · p99 853ms
TodoMVC · Vue todomvc-vuekitesurf · median 102ms · p95 107ms · p99 107ms container · median 728ms · p95 809ms · p99 809ms
TodoMVC · Angular todomvc-angularkitesurf · median 98ms · p95 115ms · p99 115ms container · median 478ms · p95 543ms · p99 543ms
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 34MiB · p95 34MiB · p99 34MiB container · median 4MiB · p95 5MiB · p99 5MiB
The Cloudflare Blog cf-blogkitesurf · median 30MiB · p95 30MiB · p99 30MiB container · median 4MiB · p95 6MiB · p99 6MiB
Wikipedia Portal wikipedia-portalkitesurf · median 70MiB · p95 70MiB · p99 70MiB container · median 10MiB · p95 10MiB · p99 10MiB
Der Spiegel spiegelkitesurf · median 66MiB · p95 67MiB · p99 67MiB container · median 9MiB · p95 9MiB · p99 9MiB
El Mundo elmundokitesurf · median 13MiB · p95 13MiB · p99 13MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · React todomvc-reactkitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 4MiB · 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 32MiB · p99 32MiB container · median 4MiB · p95 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 34MiB · p95 34MiB · p99 34MiB container · median 3MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 28MiB · p95 28MiB · p99 28MiB container · median 4MiB · p95 6MiB · p99 6MiB
Wikipedia Portal wikipedia-portalkitesurf · median 71MiB · p95 98MiB · p99 98MiB container · median 10MiB · p95 10MiB · p99 10MiB
Der Spiegel spiegelkitesurf · median 39MiB · p95 53MiB · p99 53MiB container · median 9MiB · p95 9MiB · p99 9MiB
El Mundo elmundokitesurf · median 8MiB · p95 8MiB · p99 8MiB container · median 2MiB · p95 3MiB · p99 3MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · React todomvc-reactkitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 3MiB · 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)
Latest run · 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
Latest report (markdown)
latest.md
latest.json
history.json
badge.svg
# kitesurf bench report — 2026-07-11
commit: `15ac2dc` · backends: kitesurf, container · endpoints: screenshot, html · runs/combo: 5 (+ 2 warmup)
target: https://kitesurf-bench.rendering.cfdata.org
## Summary (median wall time)
| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 847ms | 814ms | 405ms | 232ms |
| Hacker News | 1178ms | 1023ms | 855ms | 619ms |
| Cloudflare Developer Docs | 3340ms | 3318ms | 858ms | 725ms |
| The Cloudflare Blog | 1644ms | 1653ms | 1031ms | 823ms |
| Wikipedia Portal | 1195ms | 1488ms | 884ms | 589ms |
| Der Spiegel | 1626ms | 1651ms | 1804ms | 2011ms |
| El Mundo | 5273ms | 2085ms | 1633ms | 1216ms |
| TodoMVC · JavaScript ES6 | 844ms | 809ms | 541ms | 310ms |
| TodoMVC · React | 1476ms | 850ms | 527ms | 335ms |
| TodoMVC · Vue | 1081ms | 855ms | 508ms | 403ms |
| TodoMVC · Angular | 986ms | 898ms | 627ms | 407ms |
| TodoMVC · Preact | 816ms | 792ms | 549ms | 285ms |
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