kitesurf · bench
Viewing archived run 2026-06-05 · commit c8a9da7. 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 662ms · p95 1113ms · p99 1113ms container · median 367ms · p95 394ms · p99 394ms
Example Domain example-comkitesurf · median 876ms · p95 920ms · p99 920ms container · median 740ms · p95 784ms · p99 784ms
Hacker News hacker-newskitesurf · median 1773ms · p95 2184ms · p99 2184ms container · median 989ms · p95 1064ms · p99 1064ms
Cloudflare Developer Docs cf-developerskitesurf · median 2128ms · p95 2643ms · p99 2643ms container · median 1222ms · p95 1338ms · p99 1338ms
The Cloudflare Blog cf-blogkitesurf · median 1189ms · p95 2271ms · p99 2271ms container · median 879ms · p95 1009ms · p99 1009ms
Wikipedia Portal wikipedia-portalkitesurf · median 1920ms · p95 2167ms · p99 2167ms container · median 1734ms · p95 1837ms · p99 1837ms
Der Spiegel spiegelkitesurf · median 2603ms · p95 3502ms · p99 3502ms container · median 2408ms · p95 2688ms · p99 2688ms
El Mundo elmundokitesurf · median 671ms · p95 728ms · p99 728ms container · median 494ms · p95 557ms · p99 557ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 735ms · p95 1067ms · p99 1067ms container · median 520ms · p95 557ms · p99 557ms
TodoMVC · React todomvc-reactkitesurf · median 1011ms · p95 2238ms · p99 2238ms container · median 527ms · p95 547ms · p99 547ms
TodoMVC · Vue todomvc-vuekitesurf · median 1215ms · p95 1829ms · p99 1829ms container · median 539ms · p95 623ms · p99 623ms
TodoMVC · Angular todomvc-angularkitesurf · median 709ms · p95 1506ms · p99 1506ms container · median 421ms · p95 442ms · p99 442ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
625ms
1250ms
1875ms
2500ms
kitesurf · median 582ms · p95 1208ms · p99 1208ms container · median 161ms · p95 181ms · p99 181ms
Example Domain example-comkitesurf · median 1036ms · p95 1091ms · p99 1091ms container · median 532ms · p95 884ms · p99 884ms
Hacker News hacker-newskitesurf · median 2097ms · p95 2144ms · p99 2144ms container · median 1000ms · p95 1029ms · p99 1029ms
Cloudflare Developer Docs cf-developerskitesurf · median 1607ms · p95 2200ms · p99 2200ms container · median 952ms · p95 1069ms · p99 1069ms
The Cloudflare Blog cf-blogkitesurf · median 786ms · p95 978ms · p99 978ms container · median 730ms · p95 879ms · p99 879ms
Wikipedia Portal wikipedia-portalkitesurf · median 1700ms · p95 3036ms · p99 3036ms container · median 1488ms · p95 1644ms · p99 1644ms
Der Spiegel spiegelkitesurf · median 1892ms · p95 4301ms · p99 4301ms container · median 2280ms · p95 2699ms · p99 2699ms
El Mundo elmundokitesurf · median 629ms · p95 940ms · p99 940ms container · median 294ms · p95 325ms · p99 325ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 693ms · p95 1007ms · p99 1007ms container · median 327ms · p95 345ms · p99 345ms
TodoMVC · React todomvc-reactkitesurf · median 874ms · p95 1105ms · p99 1105ms container · median 310ms · p95 350ms · p99 350ms
TodoMVC · Vue todomvc-vuekitesurf · median 1238ms · p95 3188ms · p99 3188ms container · median 329ms · p95 355ms · p99 355ms
TodoMVC · Angular todomvc-angularkitesurf · median 620ms · p95 673ms · p99 673ms container · median 276ms · p95 377ms · p99 377ms
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
2500ms
5000ms
7500ms
10000ms
kitesurf · median 95ms · p95 129ms · p99 129ms container · median 593ms · p95 605ms · p99 605ms
Example Domain example-comkitesurf · median 194ms · p95 211ms · p99 211ms container · median 808ms · p95 901ms · p99 901ms
Hacker News hacker-newskitesurf · median 736ms · p95 912ms · p99 912ms container · median 2146ms · p95 2520ms · p99 2520ms
Cloudflare Developer Docs cf-developerskitesurf · median 625ms · p95 649ms · p99 649ms container · median 2589ms · p95 3093ms · p99 3093ms
The Cloudflare Blog cf-blogkitesurf · median 418ms · p95 490ms · p99 490ms container · median 2050ms · p95 2178ms · p99 2178ms
Wikipedia Portal wikipedia-portalkitesurf · median 995ms · p95 1238ms · p99 1238ms container · median 3616ms · p95 3850ms · p99 3850ms
Der Spiegel spiegelkitesurf · median 1659ms · p95 2216ms · p99 2216ms container · median 5642ms · p95 6413ms · p99 6413ms
El Mundo elmundokitesurf · median 92ms · p95 132ms · p99 132ms container · median 1021ms · p95 1215ms · p99 1215ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 116ms · p95 145ms · p99 145ms container · median 1032ms · p95 1112ms · p99 1112ms
TodoMVC · React todomvc-reactkitesurf · median 325ms · p95 408ms · p99 408ms container · median 1120ms · p95 1141ms · p99 1141ms
TodoMVC · Vue todomvc-vuekitesurf · median 441ms · p95 539ms · p99 539ms container · median 1089ms · p95 1214ms · p99 1214ms
TodoMVC · Angular todomvc-angularkitesurf · median 118ms · p95 267ms · p99 267ms container · median 903ms · p95 998ms · p99 998ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 33ms · p95 85ms · p99 85ms container · median 347ms · p95 386ms · p99 386ms
Example Domain example-comkitesurf · median 70ms · p95 78ms · p99 78ms container · median 585ms · p95 1179ms · p99 1179ms
Hacker News hacker-newskitesurf · median 698ms · p95 745ms · p99 745ms container · median 2132ms · p95 2289ms · p99 2289ms
Cloudflare Developer Docs cf-developerskitesurf · median 424ms · p95 505ms · p99 505ms container · median 2053ms · p95 2361ms · p99 2361ms
The Cloudflare Blog cf-blogkitesurf · median 158ms · p95 231ms · p99 231ms container · median 1583ms · p95 2159ms · p99 2159ms
Wikipedia Portal wikipedia-portalkitesurf · median 813ms · p95 914ms · p99 914ms container · median 2905ms · p95 3255ms · p99 3255ms
Der Spiegel spiegelkitesurf · median 958ms · p95 1469ms · p99 1469ms container · median 4918ms · p95 5786ms · p99 5786ms
El Mundo elmundokitesurf · median 48ms · p95 58ms · p99 58ms container · median 607ms · p95 711ms · p99 711ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 76ms · p95 80ms · p99 80ms container · median 720ms · p95 749ms · p99 749ms
TodoMVC · React todomvc-reactkitesurf · median 200ms · p95 251ms · p99 251ms container · median 684ms · p95 777ms · p99 777ms
TodoMVC · Vue todomvc-vuekitesurf · median 436ms · p95 479ms · p99 479ms container · median 715ms · p95 771ms · p99 771ms
TodoMVC · Angular todomvc-angularkitesurf · median 54ms · p95 63ms · p99 63ms container · median 561ms · p95 1070ms · p99 1070ms
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
48MiB
95MiB
143MiB
191MiB
kitesurf · median 15MiB · p95 15MiB · p99 15MiB container · median 2MiB · p95 2MiB · p99 2MiB
Example Domain example-comkitesurf · median 20MiB · p95 20MiB · p99 20MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 29MiB · p95 29MiB · p99 29MiB container · median 4MiB · p95 5MiB · p99 5MiB
Cloudflare Developer Docs cf-developerskitesurf · median 46MiB · p95 46MiB · p99 46MiB container · median 4MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 28MiB · p95 28MiB · p99 28MiB container · median 3MiB · p95 3MiB · p99 3MiB
Wikipedia Portal wikipedia-portalkitesurf · median 97MiB · p95 97MiB · p99 97MiB container · median 7MiB · p95 7MiB · p99 7MiB
Der Spiegel spiegelkitesurf · median 74MiB · p95 74MiB · p99 74MiB container · median 19MiB · p95 20MiB · p99 20MiB
El Mundo elmundokitesurf · median 16MiB · p95 16MiB · p99 16MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 16MiB · p95 16MiB · p99 16MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · React todomvc-reactkitesurf · median 16MiB · p95 16MiB · p99 16MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · Vue todomvc-vuekitesurf · median 16MiB · p95 16MiB · p99 16MiB container · median 7MiB · p95 7MiB · p99 7MiB
TodoMVC · Angular todomvc-angularkitesurf · median 16MiB · p95 16MiB · p99 16MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · mem
0MiB
48MiB
95MiB
143MiB
191MiB
kitesurf · median 10MiB · p95 10MiB · p99 10MiB container · median 2MiB · p95 2MiB · p99 2MiB
Example Domain example-comkitesurf · median 13MiB · p95 13MiB · p99 13MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 29MiB · p95 29MiB · p99 29MiB container · median 4MiB · p95 5MiB · p99 5MiB
Cloudflare Developer Docs cf-developerskitesurf · median 45MiB · p95 46MiB · p99 46MiB container · median 4MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 20MiB · p95 20MiB · p99 20MiB container · median 3MiB · p95 5MiB · p99 5MiB
Wikipedia Portal wikipedia-portalkitesurf · median 97MiB · p95 97MiB · p99 97MiB container · median 7MiB · p95 7MiB · p99 7MiB
Der Spiegel spiegelkitesurf · median 52MiB · p95 52MiB · p99 52MiB container · median 20MiB · p95 21MiB · p99 21MiB
El Mundo elmundokitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 2MiB · p95 2MiB · p99 2MiB
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 3MiB · p95 3MiB · p99 3MiB
TodoMVC · Vue todomvc-vuekitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 7MiB · p95 7MiB · p99 7MiB
TodoMVC · Angular todomvc-angularkitesurf · median 11MiB · p95 11MiB · p99 11MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
Run 2026-06-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-06-05.md
2026-06-05.json
history.json
badge.svg
# kitesurf bench report — 2026-06-05
commit: `c8a9da7` · backends: kitesurf, container · endpoints: screenshot, html · runs/combo: 5 (+ 2 warmup)
target: https://kitesurf-bench.rendering.cfdata.org
> Refactor autoresearch for memory optimization + port wasm-memprof + autoresearch memory opts @lduarte
## Summary (median wall time)
| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 521ms | 482ms | 486ms | 290ms |
| Hacker News | 630ms | 877ms | 896ms | 1003ms |
| Cloudflare Developer Docs | 1084ms | 1600ms | 1137ms | 1146ms |
| The Cloudflare Blog | 1608ms | 1294ms | 1356ms | 1152ms |
| Wikipedia Portal | 715ms | 597ms | 1080ms | 920ms |
| Der Spiegel | 1082ms | 1070ms | 1871ms | 1754ms |
| El Mundo | 1074ms | 1070ms | 2574ms | 2597ms |
| TodoMVC · JavaScript ES6 | 521ms | 513ms | 630ms | 415ms |
| TodoMVC · React | 687ms | 552ms | 662ms | 449ms |
| TodoMVC · Vue | 745ms | 627ms | 660ms | 468ms |
| TodoMVC · Angular | 983ms | 951ms | 659ms | 446ms |
| TodoMVC · Preact | 524ms | 492ms | 543ms | 413ms |
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