kitesurf · bench
Viewing archived run 2026-06-15 · commit 78edd79. 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 480ms · p95 491ms · p99 491ms container · median 232ms · p95 240ms · p99 240ms
Example Domain example-comkitesurf · median 745ms · p95 1259ms · p99 1259ms container · median 607ms · p95 647ms · p99 647ms
Hacker News hacker-newskitesurf · median 1454ms · p95 2953ms · p99 2953ms container · median 647ms · p95 675ms · p99 675ms
Cloudflare Developer Docs cf-developerskitesurf · median 1748ms · p95 1870ms · p99 1870ms container · median 693ms · p95 746ms · p99 746ms
The Cloudflare Blog cf-blogkitesurf · median 1432ms · p95 1499ms · p99 1499ms container · median 571ms · p95 4629ms · p99 4629ms
Wikipedia Portal wikipedia-portalkitesurf · median 1884ms · p95 1952ms · p99 1952ms container · median 1055ms · p95 1124ms · p99 1124ms
Der Spiegel spiegelkitesurf · median 3383ms · p95 3675ms · p99 3675ms container · median 1795ms · p95 1812ms · p99 1812ms
El Mundo elmundokitesurf · median 945ms · p95 1004ms · p99 1004ms container · median 335ms · p95 402ms · p99 402ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 1040ms · p95 1112ms · p99 1112ms container · median 337ms · p95 356ms · p99 356ms
TodoMVC · React todomvc-reactkitesurf · median 950ms · p95 1107ms · p99 1107ms container · median 309ms · p95 370ms · p99 370ms
TodoMVC · Vue todomvc-vuekitesurf · median 1666ms · p95 2089ms · p99 2089ms container · median 373ms · p95 382ms · p99 382ms
TodoMVC · Angular todomvc-angularkitesurf · median 914ms · p95 984ms · p99 984ms container · median 309ms · p95 321ms · p99 321ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · wall
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 467ms · p95 473ms · p99 473ms container · median 107ms · p95 112ms · p99 112ms
Example Domain example-comkitesurf · median 662ms · p95 673ms · p99 673ms container · median 459ms · p95 754ms · p99 754ms
Hacker News hacker-newskitesurf · median 1531ms · p95 1590ms · p99 1590ms container · median 519ms · p95 569ms · p99 569ms
Cloudflare Developer Docs cf-developerskitesurf · median 1588ms · p95 1714ms · p99 1714ms container · median 505ms · p95 612ms · p99 612ms
The Cloudflare Blog cf-blogkitesurf · median 1225ms · p95 1265ms · p99 1265ms container · median 354ms · p95 392ms · p99 392ms
Wikipedia Portal wikipedia-portalkitesurf · median 1445ms · p95 1445ms · p99 1445ms container · median 964ms · p95 996ms · p99 996ms
Der Spiegel spiegelkitesurf · median 2779ms · p95 5092ms · p99 5092ms container · median 1380ms · p95 1522ms · p99 1522ms
El Mundo elmundokitesurf · median 618ms · p95 957ms · p99 957ms container · median 165ms · p95 211ms · p99 211ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 688ms · p95 979ms · p99 979ms container · median 170ms · p95 202ms · p99 202ms
TodoMVC · React todomvc-reactkitesurf · median 799ms · p95 889ms · p99 889ms container · median 174ms · p95 187ms · p99 187ms
TodoMVC · Vue todomvc-vuekitesurf · median 1527ms · p95 1605ms · p99 1605ms container · median 222ms · p95 244ms · p99 244ms
TodoMVC · Angular todomvc-angularkitesurf · median 638ms · p95 946ms · p99 946ms container · median 149ms · p95 179ms · p99 179ms
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 51ms · p95 55ms · p99 55ms container · median 323ms · p95 330ms · p99 330ms
Example Domain example-comkitesurf · median 154ms · p95 176ms · p99 176ms container · median 486ms · p95 514ms · p99 514ms
Hacker News hacker-newskitesurf · median 553ms · p95 1878ms · p99 1878ms container · median 1287ms · p95 1427ms · p99 1427ms
Cloudflare Developer Docs cf-developerskitesurf · median 455ms · p95 461ms · p99 461ms container · median 1484ms · p95 1982ms · p99 1982ms
The Cloudflare Blog cf-blogkitesurf · median 410ms · p95 425ms · p99 425ms container · median 1124ms · p95 1438ms · p99 1438ms
Wikipedia Portal wikipedia-portalkitesurf · median 1026ms · p95 1058ms · p99 1058ms container · median 2098ms · p95 2209ms · p99 2209ms
Der Spiegel spiegelkitesurf · median 1819ms · p95 2019ms · p99 2019ms container · median 3918ms · p95 4259ms · p99 4259ms
El Mundo elmundokitesurf · median 95ms · p95 99ms · p99 99ms container · median 633ms · p95 745ms · p99 745ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 130ms · p95 142ms · p99 142ms container · median 555ms · p95 599ms · p99 599ms
TodoMVC · React todomvc-reactkitesurf · median 256ms · p95 342ms · p99 342ms container · median 540ms · p95 699ms · p99 699ms
TodoMVC · Vue todomvc-vuekitesurf · median 529ms · p95 576ms · p99 576ms container · median 635ms · p95 780ms · p99 780ms
TodoMVC · Angular todomvc-angularkitesurf · median 98ms · p95 103ms · p99 103ms container · median 502ms · p95 562ms · p99 562ms
TodoMVC · Preact todomvc-preact
ks (kitesurf) ct (container)
html · cpu
0.0ms
1250ms
2500ms
3750ms
5000ms
kitesurf · median 34ms · p95 37ms · p99 37ms container · median 205ms · p95 268ms · p99 268ms
Example Domain example-comkitesurf · median 54ms · p95 55ms · p99 55ms container · median 374ms · p95 409ms · p99 409ms
Hacker News hacker-newskitesurf · median 557ms · p95 625ms · p99 625ms container · median 1072ms · p95 1142ms · p99 1142ms
Cloudflare Developer Docs cf-developerskitesurf · median 331ms · p95 368ms · p99 368ms container · median 1025ms · p95 1259ms · p99 1259ms
The Cloudflare Blog cf-blogkitesurf · median 168ms · p95 251ms · p99 251ms container · median 808ms · p95 862ms · p99 862ms
Wikipedia Portal wikipedia-portalkitesurf · median 798ms · p95 798ms · p99 798ms container · median 1732ms · p95 1815ms · p99 1815ms
Der Spiegel spiegelkitesurf · median 1159ms · p95 1251ms · p99 1251ms container · median 3268ms · p95 3423ms · p99 3423ms
El Mundo elmundokitesurf · median 50ms · p95 55ms · p99 55ms container · median 328ms · p95 425ms · p99 425ms
TodoMVC · JavaScript ES6 todomvc-js-es6kitesurf · median 82ms · p95 85ms · p99 85ms container · median 335ms · p95 391ms · p99 391ms
TodoMVC · React todomvc-reactkitesurf · median 190ms · p95 194ms · p99 194ms container · median 348ms · p95 377ms · p99 377ms
TodoMVC · Vue todomvc-vuekitesurf · median 442ms · p95 480ms · p99 480ms container · median 441ms · p95 480ms · p99 480ms
TodoMVC · Angular todomvc-angularkitesurf · median 57ms · p95 65ms · p99 65ms container · median 303ms · p95 344ms · p99 344ms
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 21MiB · p95 21MiB · p99 21MiB 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 26MiB · p95 26MiB · p99 26MiB container · median 3MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 30MiB · p95 30MiB · p99 30MiB container · median 3MiB · p95 3MiB · p99 3MiB
Wikipedia Portal wikipedia-portalkitesurf · median 94MiB · p95 94MiB · p99 94MiB container · median 8MiB · p95 8MiB · p99 8MiB
Der Spiegel spiegelkitesurf · median 71MiB · p95 72MiB · p99 72MiB 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 7MiB · p95 7MiB · p99 7MiB
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 14MiB · p95 14MiB · p99 14MiB container · median 2MiB · p95 2MiB · p99 2MiB
Hacker News hacker-newskitesurf · median 29MiB · p95 29MiB · p99 29MiB container · median 4MiB · p95 5MiB · p99 5MiB
Cloudflare Developer Docs cf-developerskitesurf · median 26MiB · p95 28MiB · p99 28MiB container · median 3MiB · p95 4MiB · p99 4MiB
The Cloudflare Blog cf-blogkitesurf · median 20MiB · p95 20MiB · p99 20MiB container · median 3MiB · p95 4MiB · p99 4MiB
Wikipedia Portal wikipedia-portalkitesurf · median 94MiB · p95 94MiB · p99 94MiB container · median 8MiB · p95 8MiB · p99 8MiB
Der Spiegel spiegelkitesurf · median 53MiB · p95 53MiB · p99 53MiB container · median 21MiB · 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 6MiB · p99 6MiB
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-15 · 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-15.md
2026-06-15.json
history.json
badge.svg
# kitesurf bench report — 2026-06-15
commit: `78edd79` · 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 | 438ms | 425ms | 289ms | 164ms |
| Hacker News | 708ms | 621ms | 721ms | 526ms |
| Cloudflare Developer Docs | 1443ms | 1049ms | 723ms | 598ms |
| The Cloudflare Blog | 1327ms | 1276ms | 773ms | 629ms |
| Wikipedia Portal | 1008ms | 996ms | 683ms | 473ms |
| Der Spiegel | 1027ms | 695ms | 1175ms | 1137ms |
| El Mundo | 1799ms | 2247ms | 1886ms | 1468ms |
| TodoMVC · JavaScript ES6 | 864ms | 501ms | 542ms | 346ms |
| TodoMVC · React | 848ms | 545ms | 421ms | 419ms |
| TodoMVC · Vue | 663ms | 602ms | 394ms | 242ms |
| TodoMVC · Angular | 1332ms | 1278ms | 442ms | 285ms |
| TodoMVC · Preact | 774ms | 512ms | 368ms | 210ms |
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