kitesurf · bench
Viewing archived run 2026-06-01 · commit d1fa08a. 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 983ms · p95 1264ms · p99 1264ms container · median 263ms · p95 268ms · p99 268ms
Example Domain example-comkitesurf · median 1606ms · p95 1671ms · p99 1671ms container · median 602ms · p95 1243ms · p99 1243ms
Hacker News hacker-newskitesurf · median 2373ms · p95 2494ms · p99 2494ms container · median 726ms · p95 792ms · p99 792ms
Cloudflare Developer Docs cf-developerskitesurf · median 2601ms · p95 3037ms · p99 3037ms container · median 732ms · p95 836ms · p99 836ms
The Cloudflare Blog cf-blogkitesurf · median 1891ms · p95 2158ms · p99 2158ms container · median 544ms · p95 673ms · p99 673ms
Wikipedia Portal wikipedia-portalkitesurf · median 1166ms · p95 1172ms · p99 1172ms container · median 299ms · p95 329ms · p99 329ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1172ms · p95 1505ms · p99 1505ms container · median 354ms · p95 367ms · p99 367ms
TodoMVC · React todomvc-reactkitesurf · median 1257ms · p95 1614ms · p99 1614ms container · median 341ms · p95 364ms · p99 364ms
TodoMVC · Vue todomvc-vuekitesurf · median 2097ms · p95 2101ms · p99 2101ms container · median 370ms · p95 389ms · p99 389ms
TodoMVC · Angular todomvc-angularkitesurf · median 1121ms · p95 1882ms · p99 1882ms container · median 325ms · p95 374ms · p99 374ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
625ms
1250ms
1875ms
2500ms
kitesurf · median 994ms · p95 1413ms · p99 1413ms container · median 115ms · p95 120ms · p99 120ms
Example Domain example-comkitesurf · median 1345ms · p95 1427ms · p99 1427ms container · median 434ms · p95 673ms · p99 673ms
Hacker News hacker-newskitesurf · median 2358ms · p95 3165ms · p99 3165ms container · median 457ms · p95 495ms · p99 495ms
Cloudflare Developer Docs cf-developerskitesurf · median 2334ms · p95 2384ms · p99 2384ms container · median 612ms · p95 769ms · p99 769ms
The Cloudflare Blog cf-blogkitesurf · median 1716ms · p95 1984ms · p99 1984ms container · median 331ms · p95 398ms · p99 398ms
Wikipedia Portal wikipedia-portalkitesurf · median 1053ms · p95 1428ms · p99 1428ms container · median 176ms · p95 198ms · p99 198ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1085ms · p95 1485ms · p99 1485ms container · median 189ms · p95 202ms · p99 202ms
TodoMVC · React todomvc-reactkitesurf · median 1233ms · p95 1886ms · p99 1886ms container · median 183ms · p95 201ms · p99 201ms
TodoMVC · Vue todomvc-vuekitesurf · median 1907ms · p95 2421ms · p99 2421ms container · median 226ms · p95 235ms · p99 235ms
TodoMVC · Angular todomvc-angularkitesurf · median 1075ms · p95 1293ms · p99 1293ms container · median 149ms · p95 191ms · p99 191ms
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
500ms
1000ms
1500ms
2000ms
kitesurf · median 375ms · p95 381ms · p99 381ms container · median 369ms · p95 381ms · p99 381ms
Example Domain example-comkitesurf · median 520ms · p95 528ms · p99 528ms container · median 552ms · p95 595ms · p99 595ms
Hacker News hacker-newskitesurf · median 1206ms · p95 1228ms · p99 1228ms container · median 1569ms · p95 1713ms · p99 1713ms
Cloudflare Developer Docs cf-developerskitesurf · median 817ms · p95 861ms · p99 861ms container · median 1515ms · p95 1739ms · p99 1739ms
The Cloudflare Blog cf-blogkitesurf · median 772ms · p95 832ms · p99 832ms container · median 1254ms · p95 1364ms · p99 1364ms
Wikipedia Portal wikipedia-portalkitesurf · median 412ms · p95 415ms · p99 415ms container · median 614ms · p95 629ms · p99 629ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 445ms · p95 454ms · p99 454ms container · median 665ms · p95 694ms · p99 694ms
TodoMVC · React todomvc-reactkitesurf · median 552ms · p95 570ms · p99 570ms container · median 688ms · p95 795ms · p99 795ms
TodoMVC · Vue todomvc-vuekitesurf · median 805ms · p95 839ms · p99 839ms container · median 722ms · p95 729ms · p99 729ms
TodoMVC · Angular todomvc-angularkitesurf · median 412ms · p95 975ms · p99 975ms container · median 648ms · p95 759ms · p99 759ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
500ms
1000ms
1500ms
2000ms
kitesurf · median 340ms · p95 347ms · p99 347ms container · median 236ms · p95 248ms · p99 248ms
Example Domain example-comkitesurf · median 387ms · p95 390ms · p99 390ms container · median 406ms · p95 501ms · p99 501ms
Hacker News hacker-newskitesurf · median 939ms · p95 1072ms · p99 1072ms container · median 1005ms · p95 1079ms · p99 1079ms
Cloudflare Developer Docs cf-developerskitesurf · median 696ms · p95 701ms · p99 701ms container · median 1240ms · p95 2326ms · p99 2326ms
The Cloudflare Blog cf-blogkitesurf · median 493ms · p95 583ms · p99 583ms container · median 723ms · p95 916ms · p99 916ms
Wikipedia Portal wikipedia-portalkitesurf · median 364ms · p95 382ms · p99 382ms container · median 374ms · p95 434ms · p99 434ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 388ms · p95 414ms · p99 414ms container · median 395ms · p95 438ms · p99 438ms
TodoMVC · React todomvc-reactkitesurf · median 496ms · p95 517ms · p99 517ms container · median 383ms · p95 421ms · p99 421ms
TodoMVC · Vue todomvc-vuekitesurf · median 762ms · p95 862ms · p99 862ms container · median 469ms · p95 490ms · p99 490ms
TodoMVC · Angular todomvc-angularkitesurf · median 363ms · p95 438ms · p99 438ms container · median 330ms · p95 402ms · p99 402ms
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 73MiB · p95 73MiB · p99 73MiB container · no data
Example Domain example-comkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
Hacker News hacker-newskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
Cloudflare Developer Docs cf-developerskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
The Cloudflare Blog cf-blogkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
Wikipedia Portal wikipedia-portalkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · React todomvc-reactkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · Vue todomvc-vuekitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · Angular todomvc-angularkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · mem
0MiB
24MiB
48MiB
72MiB
95MiB
kitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
Example Domain example-comkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
Hacker News hacker-newskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
Cloudflare Developer Docs cf-developerskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
The Cloudflare Blog cf-blogkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
Wikipedia Portal wikipedia-portalkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · React todomvc-reactkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · Vue todomvc-vuekitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · Angular todomvc-angularkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · no data
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
Run 2026-06-01 · 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-01.md
2026-06-01.json
history.json
badge.svg
# kitesurf bench report — 2026-06-01
commit: `d1fa08a` · 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 | 540ms | 592ms | 375ms | 223ms |
| Hacker News | 1094ms | 935ms | 720ms | 540ms |
| Cloudflare Developer Docs | 1391ms | 1683ms | 905ms | 591ms |
| The Cloudflare Blog | 2019ms | 1886ms | 898ms | 760ms |
| Wikipedia Portal | 1173ms | 1182ms | 879ms | 480ms |
| TodoMVC · JavaScript ES6 | 733ms | 637ms | 431ms | 289ms |
| TodoMVC · React | 668ms | 608ms | 473ms | 305ms |
| TodoMVC · Vue | 696ms | 754ms | 464ms | 293ms |
| TodoMVC · Angular | 1637ms | 1448ms | 482ms | 337ms |
| TodoMVC · Preact | 624ms | 573ms | 436ms | 262ms |
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