kitesurf · bench
Viewing archived run 2026-07-02 · commit 1f76dfb. 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 749ms · p95 1360ms · p99 1360ms container · median 217ms · p95 228ms · p99 228ms
Example Domain example-comkitesurf · median 1086ms · p95 1170ms · p99 1170ms container · median 571ms · p95 4727ms · p99 4727ms
Hacker News hacker-newskitesurf · median 1698ms · p95 2221ms · p99 2221ms container · median 499ms · p95 518ms · p99 518ms
Cloudflare Developer Docs cf-developerskitesurf · median 1933ms · p95 5277ms · p99 5277ms container · median 562ms · p95 653ms · p99 653ms
The Cloudflare Blog cf-blogkitesurf · median 1064ms · p95 2640ms · p99 2640ms container · median 474ms · p95 922ms · p99 922ms
Wikipedia Portal wikipedia-portalkitesurf · median 1908ms · p95 3631ms · p99 3631ms container · median 869ms · p95 893ms · p99 893ms
Der Spiegel spiegelkitesurf · median 1559ms · p95 4349ms · p99 4349ms container · median 877ms · p95 948ms · p99 948ms
El Mundo elmundokitesurf · median 636ms · p95 1586ms · p99 1586ms container · median 286ms · p95 535ms · p99 535ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 655ms · p95 1631ms · p99 1631ms container · median 300ms · p95 326ms · p99 326ms
TodoMVC · React todomvc-reactkitesurf · median 651ms · p95 934ms · p99 934ms container · median 324ms · p95 488ms · p99 488ms
TodoMVC · Vue todomvc-vuekitesurf · median 664ms · p95 1006ms · p99 1006ms container · median 331ms · p95 508ms · p99 508ms
TodoMVC · Angular todomvc-angularkitesurf · median 854ms · p95 947ms · p99 947ms container · median 302ms · p95 675ms · p99 675ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
500ms
1000ms
1500ms
2000ms
kitesurf · median 716ms · p95 1129ms · p99 1129ms container · median 100ms · p95 106ms · p99 106ms
Example Domain example-comkitesurf · median 942ms · p95 990ms · p99 990ms container · median 1538ms · p95 3906ms · p99 3906ms
Hacker News hacker-newskitesurf · median 1111ms · p95 4915ms · p99 4915ms container · median 399ms · p95 423ms · p99 423ms
Cloudflare Developer Docs cf-developerskitesurf · median 1402ms · p95 4198ms · p99 4198ms container · median 409ms · p95 434ms · p99 434ms
The Cloudflare Blog cf-blogkitesurf · median 840ms · p95 2359ms · p99 2359ms container · median 329ms · p95 391ms · p99 391ms
Wikipedia Portal wikipedia-portalkitesurf · median 1919ms · p95 2428ms · p99 2428ms container · median 809ms · p95 840ms · p99 840ms
Der Spiegel spiegelkitesurf · median 1988ms · p95 2116ms · p99 2116ms container · median 632ms · p95 687ms · p99 687ms
El Mundo elmundokitesurf · median 851ms · p95 929ms · p99 929ms container · median 175ms · p95 331ms · p99 331ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 616ms · p95 870ms · p99 870ms container · median 163ms · p95 172ms · p99 172ms
TodoMVC · React todomvc-reactkitesurf · median 855ms · p95 984ms · p99 984ms container · median 184ms · p95 226ms · p99 226ms
TodoMVC · Vue todomvc-vuekitesurf · median 612ms · p95 893ms · p99 893ms container · median 209ms · p95 224ms · p99 224ms
TodoMVC · Angular todomvc-angularkitesurf · median 816ms · p95 1613ms · p99 1613ms container · median 165ms · p95 174ms · p99 174ms
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 75ms · p95 248ms · p99 248ms container · median 289ms · p95 311ms · p99 311ms
Example Domain example-comkitesurf · median 259ms · p95 287ms · p99 287ms container · median 455ms · p95 667ms · p99 667ms
Hacker News hacker-newskitesurf · median 605ms · p95 628ms · p99 628ms container · median 981ms · p95 1033ms · p99 1033ms
Cloudflare Developer Docs cf-developerskitesurf · median 370ms · p95 600ms · p99 600ms container · median 1167ms · p95 1762ms · p99 1762ms
The Cloudflare Blog cf-blogkitesurf · median 464ms · p95 729ms · p99 729ms container · median 934ms · p95 959ms · p99 959ms
Wikipedia Portal wikipedia-portalkitesurf · median 1008ms · p95 1392ms · p99 1392ms container · median 1694ms · p95 1883ms · p99 1883ms
Der Spiegel spiegelkitesurf · median 677ms · p95 1727ms · p99 1727ms container · median 2085ms · p95 2183ms · p99 2183ms
El Mundo elmundokitesurf · median 80ms · p95 207ms · p99 207ms container · median 450ms · p95 484ms · p99 484ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 88ms · p95 314ms · p99 314ms container · median 472ms · p95 476ms · p99 476ms
TodoMVC · React todomvc-reactkitesurf · median 66ms · p95 88ms · p99 88ms container · median 474ms · p95 558ms · p99 558ms
TodoMVC · Vue todomvc-vuekitesurf · median 71ms · p95 75ms · p99 75ms container · median 542ms · p95 561ms · p99 561ms
TodoMVC · Angular todomvc-angularkitesurf · median 68ms · p95 76ms · p99 76ms container · median 466ms · p95 492ms · p99 492ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
500ms
1000ms
1500ms
2000ms
kitesurf · median 40ms · p95 99ms · p99 99ms container · median 200ms · p95 268ms · p99 268ms
Example Domain example-comkitesurf · median 102ms · p95 135ms · p99 135ms container · median 377ms · p95 488ms · p99 488ms
Hacker News hacker-newskitesurf · median 283ms · p95 947ms · p99 947ms container · median 783ms · p95 871ms · p99 871ms
Cloudflare Developer Docs cf-developerskitesurf · median 233ms · p95 586ms · p99 586ms container · median 813ms · p95 887ms · p99 887ms
The Cloudflare Blog cf-blogkitesurf · median 251ms · p95 443ms · p99 443ms container · median 719ms · p95 887ms · p99 887ms
Wikipedia Portal wikipedia-portalkitesurf · median 933ms · p95 1137ms · p99 1137ms container · median 1621ms · p95 1756ms · p99 1756ms
Der Spiegel spiegelkitesurf · median 691ms · p95 724ms · p99 724ms container · median 1573ms · p95 1669ms · p99 1669ms
El Mundo elmundokitesurf · median 37ms · p95 38ms · p99 38ms container · median 296ms · p95 323ms · p99 323ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 48ms · p95 50ms · p99 50ms container · median 301ms · p95 334ms · p99 334ms
TodoMVC · React todomvc-reactkitesurf · median 31ms · p95 35ms · p99 35ms container · median 349ms · p95 362ms · p99 362ms
TodoMVC · Vue todomvc-vuekitesurf · median 36ms · p95 42ms · p99 42ms container · median 402ms · p95 500ms · p99 500ms
TodoMVC · Angular todomvc-angularkitesurf · median 56ms · p95 183ms · p99 183ms container · median 331ms · p95 334ms · p99 334ms
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 10MiB · p95 10MiB · p99 10MiB 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 33MiB · p95 33MiB · p99 33MiB container · median 3MiB · p95 5MiB · p99 5MiB
The Cloudflare Blog cf-blogkitesurf · median 28MiB · p95 28MiB · p99 28MiB container · median 4MiB · p95 7MiB · p99 7MiB
Wikipedia Portal wikipedia-portalkitesurf · median 65MiB · p95 65MiB · p99 65MiB container · median 9MiB · p95 10MiB · p99 10MiB
Der Spiegel spiegelkitesurf · median 25MiB · p95 46MiB · p99 46MiB container · median 9MiB · p95 9MiB · p99 9MiB
El Mundo elmundokitesurf · median 12MiB · p95 12MiB · p99 12MiB container · median 2MiB · 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 3MiB · 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 8MiB · p95 8MiB · p99 8MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 31MiB · p95 31MiB · p99 31MiB container · median 4MiB · p95 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 32MiB · p95 33MiB · p99 33MiB container · median 3MiB · p95 5MiB · p99 5MiB
The Cloudflare Blog cf-blogkitesurf · median 26MiB · p95 26MiB · p99 26MiB container · median 4MiB · p95 6MiB · p99 6MiB
Wikipedia Portal wikipedia-portalkitesurf · median 66MiB · p95 91MiB · p99 91MiB container · median 9MiB · p95 9MiB · p99 9MiB
Der Spiegel spiegelkitesurf · median 27MiB · p95 31MiB · p99 31MiB container · median 9MiB · p95 9MiB · p99 9MiB
El Mundo elmundokitesurf · median 7MiB · p95 7MiB · p99 7MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 6MiB · p95 6MiB · p99 6MiB container · median 3MiB · p95 4MiB · p99 4MiB
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)
Run 2026-07-02 · 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-07-02.md
2026-07-02.json
history.json
badge.svg
# kitesurf bench report — 2026-07-02
commit: `1f76dfb` · backends: kitesurf, container · endpoints: screenshot, html · runs/combo: 5 (+ 2 warmup)
target: https://kitesurf-bench.rendering.cfdata.org
> Reduce wasm peak memory ~23% (emoji SVG-strip + node-slab pre-size + lazy serif) @lduarte
## Summary (median wall time)
| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 708ms | 674ms | 322ms | 202ms |
| Hacker News | 1054ms | 902ms | 737ms | 1788ms |
| Cloudflare Developer Docs | 1674ms | 796ms | 650ms | 563ms |
| The Cloudflare Blog | 1597ms | 1169ms | 724ms | 532ms |
| Wikipedia Portal | 560ms | 547ms | 696ms | 512ms |
| Der Spiegel | 1106ms | 1050ms | 1032ms | 1039ms |
| El Mundo | 1051ms | 1648ms | 993ms | 992ms |
| TodoMVC · JavaScript ES6 | 500ms | 755ms | 629ms | 293ms |
| TodoMVC · React | 515ms | 517ms | 711ms | 271ms |
| TodoMVC · Vue | 533ms | 773ms | 552ms | 298ms |
| TodoMVC · Angular | 547ms | 522ms | 435ms | 301ms |
| TodoMVC · Preact | 731ms | 776ms | 399ms | 263ms |
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