kitesurf · bench
Viewing archived run 2026-06-06 · commit 9afdd69. 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 595ms · p95 617ms · p99 617ms container · median 323ms · p95 355ms · p99 355ms
Example Domain example-comkitesurf · median 1198ms · p95 1710ms · p99 1710ms container · median 729ms · p95 792ms · p99 792ms
Hacker News hacker-newskitesurf · median 2052ms · p95 2147ms · p99 2147ms container · median 918ms · p95 930ms · p99 930ms
Cloudflare Developer Docs cf-developerskitesurf · median 1905ms · p95 2584ms · p99 2584ms container · median 917ms · p95 968ms · p99 968ms
The Cloudflare Blog cf-blogkitesurf · median 1198ms · p95 1294ms · p99 1294ms container · median 682ms · p95 777ms · p99 777ms
Wikipedia Portal wikipedia-portalkitesurf · median 2128ms · p95 2693ms · p99 2693ms container · median 1256ms · p95 1531ms · p99 1531ms
Der Spiegel spiegelkitesurf · median 3221ms · p95 3562ms · p99 3562ms container · median 2014ms · p95 2170ms · p99 2170ms
El Mundo elmundokitesurf · median 655ms · p95 964ms · p99 964ms container · median 387ms · p95 401ms · p99 401ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 712ms · p95 1278ms · p99 1278ms container · median 415ms · p95 466ms · p99 466ms
TodoMVC · React todomvc-reactkitesurf · median 942ms · p95 1065ms · p99 1065ms container · median 395ms · p95 443ms · p99 443ms
TodoMVC · Vue todomvc-vuekitesurf · median 1516ms · p95 1813ms · p99 1813ms container · median 472ms · p95 523ms · p99 523ms
TodoMVC · Angular todomvc-angularkitesurf · median 662ms · p95 1017ms · p99 1017ms container · median 381ms · p95 428ms · p99 428ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
625ms
1250ms
1875ms
2500ms
kitesurf · median 591ms · p95 1079ms · p99 1079ms container · median 144ms · p95 147ms · p99 147ms
Example Domain example-comkitesurf · median 765ms · p95 804ms · p99 804ms container · median 515ms · p95 813ms · p99 813ms
Hacker News hacker-newskitesurf · median 1654ms · p95 1848ms · p99 1848ms container · median 662ms · p95 756ms · p99 756ms
Cloudflare Developer Docs cf-developerskitesurf · median 1782ms · p95 1852ms · p99 1852ms container · median 822ms · p95 1107ms · p99 1107ms
The Cloudflare Blog cf-blogkitesurf · median 1833ms · p95 2157ms · p99 2157ms container · median 412ms · p95 496ms · p99 496ms
Wikipedia Portal wikipedia-portalkitesurf · median 1834ms · p95 1869ms · p99 1869ms container · median 1434ms · p95 1460ms · p99 1460ms
Der Spiegel spiegelkitesurf · median 2436ms · p95 2960ms · p99 2960ms container · median 1845ms · p95 2003ms · p99 2003ms
El Mundo elmundokitesurf · median 614ms · p95 885ms · p99 885ms container · median 225ms · p95 229ms · p99 229ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 663ms · p95 957ms · p99 957ms container · median 249ms · p95 284ms · p99 284ms
TodoMVC · React todomvc-reactkitesurf · median 851ms · p95 957ms · p99 957ms container · median 218ms · p95 242ms · p99 242ms
TodoMVC · Vue todomvc-vuekitesurf · median 1454ms · p95 1782ms · p99 1782ms container · median 285ms · p95 299ms · p99 299ms
TodoMVC · Angular todomvc-angularkitesurf · median 614ms · p95 1241ms · p99 1241ms container · median 201ms · p95 216ms · p99 216ms
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 70ms · p95 79ms · p99 79ms container · median 495ms · p95 555ms · p99 555ms
Example Domain example-comkitesurf · median 242ms · p95 592ms · p99 592ms container · median 760ms · p95 998ms · p99 998ms
Hacker News hacker-newskitesurf · median 991ms · p95 1059ms · p99 1059ms container · median 1991ms · p95 2152ms · p99 2152ms
Cloudflare Developer Docs cf-developerskitesurf · median 619ms · p95 631ms · p99 631ms container · median 2020ms · p95 2076ms · p99 2076ms
The Cloudflare Blog cf-blogkitesurf · median 477ms · p95 526ms · p99 526ms container · median 1556ms · p95 1805ms · p99 1805ms
Wikipedia Portal wikipedia-portalkitesurf · median 1230ms · p95 1424ms · p99 1424ms container · median 2532ms · p95 3050ms · p99 3050ms
Der Spiegel spiegelkitesurf · median 1869ms · p95 1941ms · p99 1941ms container · median 4774ms · p95 5365ms · p99 5365ms
El Mundo elmundokitesurf · median 103ms · p95 107ms · p99 107ms container · median 701ms · p95 730ms · p99 730ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 132ms · p95 280ms · p99 280ms container · median 772ms · p95 890ms · p99 890ms
TodoMVC · React todomvc-reactkitesurf · median 258ms · p95 355ms · p99 355ms container · median 772ms · p95 798ms · p99 798ms
TodoMVC · Vue todomvc-vuekitesurf · median 539ms · p95 622ms · p99 622ms container · median 869ms · p95 1078ms · p99 1078ms
TodoMVC · Angular todomvc-angularkitesurf · median 106ms · p95 110ms · p99 110ms container · median 714ms · p95 973ms · p99 973ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 44ms · p95 242ms · p99 242ms container · median 287ms · p95 317ms · p99 317ms
Example Domain example-comkitesurf · median 85ms · p95 106ms · p99 106ms container · median 522ms · p95 643ms · p99 643ms
Hacker News hacker-newskitesurf · median 669ms · p95 738ms · p99 738ms container · median 1446ms · p95 1787ms · p99 1787ms
Cloudflare Developer Docs cf-developerskitesurf · median 479ms · p95 486ms · p99 486ms container · median 1800ms · p95 3487ms · p99 3487ms
The Cloudflare Blog cf-blogkitesurf · median 253ms · p95 497ms · p99 497ms container · median 913ms · p95 1189ms · p99 1189ms
Wikipedia Portal wikipedia-portalkitesurf · median 965ms · p95 972ms · p99 972ms container · median 2674ms · p95 2783ms · p99 2783ms
Der Spiegel spiegelkitesurf · median 1203ms · p95 1236ms · p99 1236ms container · median 4176ms · p95 4386ms · p99 4386ms
El Mundo elmundokitesurf · median 54ms · p95 65ms · p99 65ms container · median 471ms · p95 511ms · p99 511ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 79ms · p95 83ms · p99 83ms container · median 535ms · p95 632ms · p99 632ms
TodoMVC · React todomvc-reactkitesurf · median 206ms · p95 255ms · p99 255ms container · median 488ms · p95 523ms · p99 523ms
TodoMVC · Vue todomvc-vuekitesurf · median 472ms · p95 552ms · p99 552ms container · median 604ms · p95 645ms · p99 645ms
TodoMVC · Angular todomvc-angularkitesurf · median 56ms · p95 173ms · p99 173ms container · median 455ms · p95 472ms · p99 472ms
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 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 27MiB · p95 29MiB · p99 29MiB container · median 4MiB · p95 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 46MiB · p95 46MiB · p99 46MiB container · median 4MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 27MiB · p95 27MiB · p99 27MiB container · median 2MiB · p95 3MiB · p99 3MiB
Wikipedia Portal wikipedia-portalkitesurf · median 91MiB · p95 91MiB · p99 91MiB container · median 8MiB · p95 8MiB · p99 8MiB
Der Spiegel spiegelkitesurf · median 68MiB · p95 68MiB · p99 68MiB container · median 20MiB · p95 21MiB · p99 21MiB
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 6MiB · p95 6MiB · p99 6MiB
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
24MiB
48MiB
72MiB
95MiB
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 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 45MiB · p95 46MiB · p99 46MiB container · median 3MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 20MiB · p95 20MiB · p99 20MiB container · median 3MiB · p95 3MiB · p99 3MiB
Wikipedia Portal wikipedia-portalkitesurf · median 91MiB · p95 91MiB · p99 91MiB container · median 8MiB · p95 8MiB · p99 8MiB
Der Spiegel spiegelkitesurf · median 50MiB · p95 51MiB · p99 51MiB 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 6MiB · 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-06 · 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-06.md
2026-06-06.json
history.json
badge.svg
# kitesurf bench report — 2026-06-06
commit: `9afdd69` · 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 | 556ms | 721ms | 380ms | 198ms |
| Hacker News | 906ms | 617ms | 845ms | 591ms |
| Cloudflare Developer Docs | 1280ms | 1175ms | 987ms | 749ms |
| The Cloudflare Blog | 1368ms | 1386ms | 1193ms | 902ms |
| Wikipedia Portal | 727ms | 1457ms | 778ms | 548ms |
| Der Spiegel | 1102ms | 1076ms | 1367ms | 1620ms |
| El Mundo | 1564ms | 1375ms | 2162ms | 1928ms |
| TodoMVC · JavaScript ES6 | 499ms | 483ms | 445ms | 283ms |
| TodoMVC · React | 512ms | 514ms | 513ms | 343ms |
| TodoMVC · Vue | 693ms | 611ms | 448ms | 285ms |
| TodoMVC · Angular | 1118ms | 1052ms | 544ms | 355ms |
| TodoMVC · Preact | 490ms | 489ms | 444ms | 260ms |
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