kitesurf · bench
Viewing archived run 2026-06-02 · commit 36cc68a. 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 1131ms · p95 1694ms · p99 1694ms container · median 334ms · p95 377ms · p99 377ms
Example Domain example-comkitesurf · median 1459ms · p95 1517ms · p99 1517ms container · median 731ms · p95 782ms · p99 782ms
Hacker News hacker-newskitesurf · median 2090ms · p95 4689ms · p99 4689ms container · median 913ms · p95 1055ms · p99 1055ms
Cloudflare Developer Docs cf-developerskitesurf · median 1940ms · p95 3872ms · p99 3872ms container · median 1034ms · p95 1161ms · p99 1161ms
The Cloudflare Blog cf-blogkitesurf · median 1534ms · p95 3111ms · p99 3111ms container · median 763ms · p95 809ms · p99 809ms
Wikipedia Portal wikipedia-portalkitesurf · median 2350ms · p95 3129ms · p99 3129ms container · median 1844ms · p95 1978ms · p99 1978ms
Der Spiegel spiegelkitesurf · median 3494ms · p95 5758ms · p99 5758ms container · median 2344ms · p95 3255ms · p99 3255ms
El Mundo elmundokitesurf · median 1231ms · p95 1370ms · p99 1370ms container · median 450ms · p95 504ms · p99 504ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1203ms · p95 1265ms · p99 1265ms container · median 456ms · p95 510ms · p99 510ms
TodoMVC · React todomvc-reactkitesurf · median 1162ms · p95 1297ms · p99 1297ms container · median 476ms · p95 503ms · p99 503ms
TodoMVC · Vue todomvc-vuekitesurf · median 1818ms · p95 1828ms · p99 1828ms container · median 587ms · p95 621ms · p99 621ms
TodoMVC · Angular todomvc-angularkitesurf · median 1270ms · p95 1362ms · p99 1362ms container · median 451ms · p95 662ms · p99 662ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 919ms · p95 1017ms · p99 1017ms container · median 159ms · p95 318ms · p99 318ms
Example Domain example-comkitesurf · median 1394ms · p95 1494ms · p99 1494ms container · median 549ms · p95 823ms · p99 823ms
Hacker News hacker-newskitesurf · median 1730ms · p95 1906ms · p99 1906ms container · median 668ms · p95 800ms · p99 800ms
Cloudflare Developer Docs cf-developerskitesurf · median 2258ms · p95 3797ms · p99 3797ms container · median 903ms · p95 962ms · p99 962ms
The Cloudflare Blog cf-blogkitesurf · median 1393ms · p95 3171ms · p99 3171ms container · median 446ms · p95 622ms · p99 622ms
Wikipedia Portal wikipedia-portalkitesurf · median 2283ms · p95 2391ms · p99 2391ms container · median 1424ms · p95 1463ms · p99 1463ms
Der Spiegel spiegelkitesurf · median 2989ms · p95 3268ms · p99 3268ms container · median 1853ms · p95 2327ms · p99 2327ms
El Mundo elmundokitesurf · median 1188ms · p95 1242ms · p99 1242ms container · median 217ms · p95 289ms · p99 289ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1074ms · p95 1421ms · p99 1421ms container · median 252ms · p95 284ms · p99 284ms
TodoMVC · React todomvc-reactkitesurf · median 1206ms · p95 2125ms · p99 2125ms container · median 271ms · p95 300ms · p99 300ms
TodoMVC · Vue todomvc-vuekitesurf · median 1701ms · p95 1777ms · p99 1777ms container · median 336ms · p95 358ms · p99 358ms
TodoMVC · Angular todomvc-angularkitesurf · median 984ms · p95 1267ms · p99 1267ms container · median 234ms · p95 258ms · p99 258ms
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 345ms · p95 403ms · p99 403ms container · median 540ms · p95 556ms · p99 556ms
Example Domain example-comkitesurf · median 465ms · p95 497ms · p99 497ms container · median 808ms · p95 891ms · p99 891ms
Hacker News hacker-newskitesurf · median 969ms · p95 1198ms · p99 1198ms container · median 2070ms · p95 2222ms · p99 2222ms
Cloudflare Developer Docs cf-developerskitesurf · median 675ms · p95 797ms · p99 797ms container · median 2358ms · p95 2575ms · p99 2575ms
The Cloudflare Blog cf-blogkitesurf · median 664ms · p95 836ms · p99 836ms container · median 1800ms · p95 1905ms · p99 1905ms
Wikipedia Portal wikipedia-portalkitesurf · median 1267ms · p95 1299ms · p99 1299ms container · median 3520ms · p95 3883ms · p99 3883ms
Der Spiegel spiegelkitesurf · median 2020ms · p95 2296ms · p99 2296ms container · median 5497ms · p95 7273ms · p99 7273ms
El Mundo elmundokitesurf · median 356ms · p95 415ms · p99 415ms container · median 870ms · p95 993ms · p99 993ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 385ms · p95 395ms · p99 395ms container · median 878ms · p95 1114ms · p99 1114ms
TodoMVC · React todomvc-reactkitesurf · median 491ms · p95 516ms · p99 516ms container · median 970ms · p95 1037ms · p99 1037ms
TodoMVC · Vue todomvc-vuekitesurf · median 690ms · p95 748ms · p99 748ms container · median 1122ms · p95 1154ms · p99 1154ms
TodoMVC · Angular todomvc-angularkitesurf · median 353ms · p95 376ms · p99 376ms container · median 854ms · p95 901ms · p99 901ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 305ms · p95 313ms · p99 313ms container · median 339ms · p95 442ms · p99 442ms
Example Domain example-comkitesurf · median 349ms · p95 368ms · p99 368ms container · median 605ms · p95 688ms · p99 688ms
Hacker News hacker-newskitesurf · median 796ms · p95 832ms · p99 832ms container · median 1546ms · p95 1678ms · p99 1678ms
Cloudflare Developer Docs cf-developerskitesurf · median 609ms · p95 730ms · p99 730ms container · median 1971ms · p95 3122ms · p99 3122ms
The Cloudflare Blog cf-blogkitesurf · median 421ms · p95 552ms · p99 552ms container · median 1068ms · p95 1552ms · p99 1552ms
Wikipedia Portal wikipedia-portalkitesurf · median 1048ms · p95 1086ms · p99 1086ms container · median 2713ms · p95 2895ms · p99 2895ms
Der Spiegel spiegelkitesurf · median 1358ms · p95 1447ms · p99 1447ms container · median 4201ms · p95 5058ms · p99 5058ms
El Mundo elmundokitesurf · median 330ms · p95 345ms · p99 345ms container · median 487ms · p95 642ms · p99 642ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 338ms · p95 370ms · p99 370ms container · median 571ms · p95 630ms · p99 630ms
TodoMVC · React todomvc-reactkitesurf · median 440ms · p95 452ms · p99 452ms container · median 600ms · p95 694ms · p99 694ms
TodoMVC · Vue todomvc-vuekitesurf · median 713ms · p95 744ms · p99 744ms container · median 756ms · p95 893ms · p99 893ms
TodoMVC · Angular todomvc-angularkitesurf · median 296ms · p95 313ms · p99 313ms container · median 512ms · p95 553ms · p99 553ms
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 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
Example Domain example-comkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 4MiB · p95 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 4MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 3MiB · p95 4MiB · p99 4MiB
Wikipedia Portal wikipedia-portalkitesurf · median 114MiB · p95 114MiB · p99 114MiB container · median 7MiB · p95 7MiB · p99 7MiB
Der Spiegel spiegelkitesurf · median 100MiB · p95 100MiB · p99 100MiB container · median 19MiB · p95 21MiB · p99 21MiB
El Mundo elmundokitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · React todomvc-reactkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · Vue todomvc-vuekitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 7MiB · p95 7MiB · p99 7MiB
TodoMVC · Angular todomvc-angularkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · mem
0MiB
48MiB
95MiB
143MiB
191MiB
kitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
Example Domain example-comkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 4MiB · p95 4MiB · p99 4MiB
Cloudflare Developer Docs cf-developerskitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 4MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 3MiB · p95 3MiB · p99 3MiB
Wikipedia Portal wikipedia-portalkitesurf · median 114MiB · p95 130MiB · p99 130MiB container · median 7MiB · p95 7MiB · p99 7MiB
Der Spiegel spiegelkitesurf · median 83MiB · p95 84MiB · p99 84MiB container · median 20MiB · p95 20MiB · p99 20MiB
El Mundo elmundokitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · React todomvc-reactkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 3MiB · p95 3MiB · p99 3MiB
TodoMVC · Vue todomvc-vuekitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 7MiB · p95 7MiB · p99 7MiB
TodoMVC · Angular todomvc-angularkitesurf · median 73MiB · p95 73MiB · p99 73MiB container · median 2MiB · p95 2MiB · p99 2MiB
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
Run 2026-06-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-06-02.md
2026-06-02.json
history.json
badge.svg
# kitesurf bench report — 2026-06-02
commit: `36cc68a` · 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 | 802ms | 565ms | 402ms | 253ms |
| Hacker News | 917ms | 987ms | 857ms | 624ms |
| Cloudflare Developer Docs | 1254ms | 1029ms | 1003ms | 775ms |
| The Cloudflare Blog | 1388ms | 1747ms | 1163ms | 1009ms |
| Wikipedia Portal | 950ms | 1060ms | 858ms | 572ms |
| Der Spiegel | 1402ms | 1513ms | 2039ms | 1705ms |
| El Mundo | 2844ms | 2266ms | 2441ms | 1957ms |
| TodoMVC · JavaScript ES6 | 829ms | 786ms | 538ms | 290ms |
| TodoMVC · React | 823ms | 666ms | 518ms | 332ms |
| TodoMVC · Vue | 683ms | 773ms | 551ms | 333ms |
| TodoMVC · Angular | 1275ms | 1264ms | 655ms | 403ms |
| TodoMVC · Preact | 855ms | 637ms | 508ms | 295ms |
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