kitesurf · bench
Viewing archived run 2026-05-31 · commit cd6a6d5. 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
500ms
1000ms
1500ms
2000ms
kitesurf · median 668ms · p95 674ms · p99 674ms container · median 315ms · p95 341ms · p99 341ms
Example Domain example-comkitesurf · median 903ms · p95 925ms · p99 925ms container · median 645ms · p95 712ms · p99 712ms
Hacker News hacker-newskitesurf · median 1224ms · p95 1362ms · p99 1362ms container · median 1006ms · p95 1063ms · p99 1063ms
Cloudflare Developer Docs cf-developerskitesurf · median 1513ms · p95 1621ms · p99 1621ms container · median 959ms · p95 1068ms · p99 1068ms
The Cloudflare Blog cf-blogkitesurf · median 1131ms · p95 1145ms · p99 1145ms container · median 685ms · p95 775ms · p99 775ms
Wikipedia Portal wikipedia-portalkitesurf · median 723ms · p95 750ms · p99 750ms container · median 404ms · p95 437ms · p99 437ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 761ms · p95 1863ms · p99 1863ms container · median 420ms · p95 436ms · p99 436ms
TodoMVC · React todomvc-reactkitesurf · median 817ms · p95 2081ms · p99 2081ms container · median 422ms · p95 423ms · p99 423ms
TodoMVC · Vue todomvc-vuekitesurf · median 908ms · p95 920ms · p99 920ms container · median 482ms · p95 524ms · p99 524ms
TodoMVC · Angular todomvc-angularkitesurf · median 731ms · p95 1688ms · p99 1688ms container · median 394ms · p95 417ms · p99 417ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
500ms
1000ms
1500ms
2000ms
kitesurf · median 657ms · p95 680ms · p99 680ms container · median 147ms · p95 150ms · p99 150ms
Example Domain example-comkitesurf · median 832ms · p95 864ms · p99 864ms container · median 483ms · p95 742ms · p99 742ms
Hacker News hacker-newskitesurf · median 1144ms · p95 1168ms · p99 1168ms container · median 658ms · p95 800ms · p99 800ms
Cloudflare Developer Docs cf-developerskitesurf · median 1404ms · p95 3560ms · p99 3560ms container · median 742ms · p95 815ms · p99 815ms
The Cloudflare Blog cf-blogkitesurf · median 935ms · p95 955ms · p99 955ms container · median 455ms · p95 512ms · p99 512ms
Wikipedia Portal wikipedia-portalkitesurf · median 687ms · p95 696ms · p99 696ms container · median 222ms · p95 270ms · p99 270ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 706ms · p95 714ms · p99 714ms container · median 256ms · p95 276ms · p99 276ms
TodoMVC · React todomvc-reactkitesurf · median 760ms · p95 1876ms · p99 1876ms container · median 279ms · p95 302ms · p99 302ms
TodoMVC · Vue todomvc-vuekitesurf · median 877ms · p95 885ms · p99 885ms container · median 297ms · p95 321ms · p99 321ms
TodoMVC · Angular todomvc-angularkitesurf · median 687ms · p95 1673ms · p99 1673ms container · median 210ms · p95 215ms · p99 215ms
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
625ms
1250ms
1875ms
2500ms
kitesurf · median 234ms · p95 239ms · p99 239ms container · median 492ms · p95 527ms · p99 527ms
Example Domain example-comkitesurf · median 324ms · p95 338ms · p99 338ms container · median 645ms · p95 823ms · p99 823ms
Hacker News hacker-newskitesurf · median 620ms · p95 760ms · p99 760ms container · median 2243ms · p95 2417ms · p99 2417ms
Cloudflare Developer Docs cf-developerskitesurf · median 481ms · p95 491ms · p99 491ms container · median 2027ms · p95 2273ms · p99 2273ms
The Cloudflare Blog cf-blogkitesurf · median 458ms · p95 499ms · p99 499ms container · median 1607ms · p95 1840ms · p99 1840ms
Wikipedia Portal wikipedia-portalkitesurf · median 253ms · p95 262ms · p99 262ms container · median 845ms · p95 918ms · p99 918ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 276ms · p95 459ms · p99 459ms container · median 906ms · p95 945ms · p99 945ms
TodoMVC · React todomvc-reactkitesurf · median 325ms · p95 460ms · p99 460ms container · median 904ms · p95 992ms · p99 992ms
TodoMVC · Vue todomvc-vuekitesurf · median 406ms · p95 412ms · p99 412ms container · median 964ms · p95 1110ms · p99 1110ms
TodoMVC · Angular todomvc-angularkitesurf · median 263ms · p95 346ms · p99 346ms container · median 855ms · p95 978ms · p99 978ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
500ms
1000ms
1500ms
2000ms
kitesurf · median 216ms · p95 221ms · p99 221ms container · median 298ms · p95 322ms · p99 322ms
Example Domain example-comkitesurf · median 238ms · p95 270ms · p99 270ms container · median 482ms · p95 667ms · p99 667ms
Hacker News hacker-newskitesurf · median 535ms · p95 537ms · p99 537ms container · median 1404ms · p95 1793ms · p99 1793ms
Cloudflare Developer Docs cf-developerskitesurf · median 383ms · p95 643ms · p99 643ms container · median 1545ms · p95 1795ms · p99 1795ms
The Cloudflare Blog cf-blogkitesurf · median 282ms · p95 312ms · p99 312ms container · median 1082ms · p95 1172ms · p99 1172ms
Wikipedia Portal wikipedia-portalkitesurf · median 229ms · p95 239ms · p99 239ms container · median 472ms · p95 606ms · p99 606ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 232ms · p95 238ms · p99 238ms container · median 568ms · p95 603ms · p99 603ms
TodoMVC · React todomvc-reactkitesurf · median 273ms · p95 383ms · p99 383ms container · median 640ms · p95 789ms · p99 789ms
TodoMVC · Vue todomvc-vuekitesurf · median 370ms · p95 381ms · p99 381ms container · median 657ms · p95 704ms · p99 704ms
TodoMVC · Angular todomvc-angularkitesurf · median 219ms · p95 348ms · p99 348ms container · median 455ms · p95 465ms · p99 465ms
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-31 · 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-31.md
2026-05-31.json
history.json
badge.svg
# kitesurf bench report — 2026-05-31
commit: `cd6a6d5` · 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 | 633ms | 621ms | 455ms | 261ms |
| Hacker News | 872ms | 798ms | 857ms | 615ms |
| Cloudflare Developer Docs | 1196ms | 1116ms | 1141ms | 853ms |
| The Cloudflare Blog | 1483ms | 1369ms | 1157ms | 872ms |
| Wikipedia Portal | 1109ms | 869ms | 864ms | 610ms |
| TodoMVC · JavaScript ES6 | 701ms | 650ms | 580ms | 358ms |
| TodoMVC · React | 728ms | 670ms | 549ms | 372ms |
| TodoMVC · Vue | 785ms | 725ms | 545ms | 390ms |
| TodoMVC · Angular | 876ms | 844ms | 629ms | 419ms |
| TodoMVC · Preact | 679ms | 651ms | 539ms | 325ms |
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