kitesurf · bench

← back to latest

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 1360mscontainer · median 217ms · p95 228ms · p99 228ms Example Domainexample-comkitesurf · median 1086ms · p95 1170ms · p99 1170mscontainer · median 571ms · p95 4727ms · p99 4727ms Hacker Newshacker-newskitesurf · median 1698ms · p95 2221ms · p99 2221mscontainer · median 499ms · p95 518ms · p99 518ms Cloudflare Developer Docscf-developerskitesurf · median 1933ms · p95 5277ms · p99 5277mscontainer · median 562ms · p95 653ms · p99 653ms The Cloudflare Blogcf-blogkitesurf · median 1064ms · p95 2640ms · p99 2640mscontainer · median 474ms · p95 922ms · p99 922ms Wikipedia Portalwikipedia-portalkitesurf · median 1908ms · p95 3631ms · p99 3631mscontainer · median 869ms · p95 893ms · p99 893ms Der Spiegelspiegelkitesurf · median 1559ms · p95 4349ms · p99 4349mscontainer · median 877ms · p95 948ms · p99 948ms El Mundoelmundokitesurf · median 636ms · p95 1586ms · p99 1586mscontainer · median 286ms · p95 535ms · p99 535ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 655ms · p95 1631ms · p99 1631mscontainer · median 300ms · p95 326ms · p99 326ms TodoMVC · Reacttodomvc-reactkitesurf · median 651ms · p95 934ms · p99 934mscontainer · median 324ms · p95 488ms · p99 488ms TodoMVC · Vuetodomvc-vuekitesurf · median 664ms · p95 1006ms · p99 1006mscontainer · median 331ms · p95 508ms · p99 508ms TodoMVC · Angulartodomvc-angularkitesurf · median 854ms · p95 947ms · p99 947mscontainer · median 302ms · p95 675ms · p99 675ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · wall

0.0ms 500ms 1000ms 1500ms 2000ms kitesurf · median 716ms · p95 1129ms · p99 1129mscontainer · median 100ms · p95 106ms · p99 106ms Example Domainexample-comkitesurf · median 942ms · p95 990ms · p99 990mscontainer · median 1538ms · p95 3906ms · p99 3906ms Hacker Newshacker-newskitesurf · median 1111ms · p95 4915ms · p99 4915mscontainer · median 399ms · p95 423ms · p99 423ms Cloudflare Developer Docscf-developerskitesurf · median 1402ms · p95 4198ms · p99 4198mscontainer · median 409ms · p95 434ms · p99 434ms The Cloudflare Blogcf-blogkitesurf · median 840ms · p95 2359ms · p99 2359mscontainer · median 329ms · p95 391ms · p99 391ms Wikipedia Portalwikipedia-portalkitesurf · median 1919ms · p95 2428ms · p99 2428mscontainer · median 809ms · p95 840ms · p99 840ms Der Spiegelspiegelkitesurf · median 1988ms · p95 2116ms · p99 2116mscontainer · median 632ms · p95 687ms · p99 687ms El Mundoelmundokitesurf · median 851ms · p95 929ms · p99 929mscontainer · median 175ms · p95 331ms · p99 331ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 616ms · p95 870ms · p99 870mscontainer · median 163ms · p95 172ms · p99 172ms TodoMVC · Reacttodomvc-reactkitesurf · median 855ms · p95 984ms · p99 984mscontainer · median 184ms · p95 226ms · p99 226ms TodoMVC · Vuetodomvc-vuekitesurf · median 612ms · p95 893ms · p99 893mscontainer · median 209ms · p95 224ms · p99 224ms TodoMVC · Angulartodomvc-angularkitesurf · median 816ms · p95 1613ms · p99 1613mscontainer · median 165ms · p95 174ms · p99 174ms TodoMVC · Preacttodomvc-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 248mscontainer · median 289ms · p95 311ms · p99 311ms Example Domainexample-comkitesurf · median 259ms · p95 287ms · p99 287mscontainer · median 455ms · p95 667ms · p99 667ms Hacker Newshacker-newskitesurf · median 605ms · p95 628ms · p99 628mscontainer · median 981ms · p95 1033ms · p99 1033ms Cloudflare Developer Docscf-developerskitesurf · median 370ms · p95 600ms · p99 600mscontainer · median 1167ms · p95 1762ms · p99 1762ms The Cloudflare Blogcf-blogkitesurf · median 464ms · p95 729ms · p99 729mscontainer · median 934ms · p95 959ms · p99 959ms Wikipedia Portalwikipedia-portalkitesurf · median 1008ms · p95 1392ms · p99 1392mscontainer · median 1694ms · p95 1883ms · p99 1883ms Der Spiegelspiegelkitesurf · median 677ms · p95 1727ms · p99 1727mscontainer · median 2085ms · p95 2183ms · p99 2183ms El Mundoelmundokitesurf · median 80ms · p95 207ms · p99 207mscontainer · median 450ms · p95 484ms · p99 484ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 88ms · p95 314ms · p99 314mscontainer · median 472ms · p95 476ms · p99 476ms TodoMVC · Reacttodomvc-reactkitesurf · median 66ms · p95 88ms · p99 88mscontainer · median 474ms · p95 558ms · p99 558ms TodoMVC · Vuetodomvc-vuekitesurf · median 71ms · p95 75ms · p99 75mscontainer · median 542ms · p95 561ms · p99 561ms TodoMVC · Angulartodomvc-angularkitesurf · median 68ms · p95 76ms · p99 76mscontainer · median 466ms · p95 492ms · p99 492ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · cpu

0.0ms 500ms 1000ms 1500ms 2000ms kitesurf · median 40ms · p95 99ms · p99 99mscontainer · median 200ms · p95 268ms · p99 268ms Example Domainexample-comkitesurf · median 102ms · p95 135ms · p99 135mscontainer · median 377ms · p95 488ms · p99 488ms Hacker Newshacker-newskitesurf · median 283ms · p95 947ms · p99 947mscontainer · median 783ms · p95 871ms · p99 871ms Cloudflare Developer Docscf-developerskitesurf · median 233ms · p95 586ms · p99 586mscontainer · median 813ms · p95 887ms · p99 887ms The Cloudflare Blogcf-blogkitesurf · median 251ms · p95 443ms · p99 443mscontainer · median 719ms · p95 887ms · p99 887ms Wikipedia Portalwikipedia-portalkitesurf · median 933ms · p95 1137ms · p99 1137mscontainer · median 1621ms · p95 1756ms · p99 1756ms Der Spiegelspiegelkitesurf · median 691ms · p95 724ms · p99 724mscontainer · median 1573ms · p95 1669ms · p99 1669ms El Mundoelmundokitesurf · median 37ms · p95 38ms · p99 38mscontainer · median 296ms · p95 323ms · p99 323ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 48ms · p95 50ms · p99 50mscontainer · median 301ms · p95 334ms · p99 334ms TodoMVC · Reacttodomvc-reactkitesurf · median 31ms · p95 35ms · p99 35mscontainer · median 349ms · p95 362ms · p99 362ms TodoMVC · Vuetodomvc-vuekitesurf · median 36ms · p95 42ms · p99 42mscontainer · median 402ms · p95 500ms · p99 500ms TodoMVC · Angulartodomvc-angularkitesurf · median 56ms · p95 183ms · p99 183mscontainer · median 331ms · p95 334ms · p99 334ms TodoMVC · Preacttodomvc-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.

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 10MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Example Domainexample-comkitesurf · median 16MiB · p95 16MiB · p99 16MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Hacker Newshacker-newskitesurf · median 33MiB · p95 33MiB · p99 33MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB Cloudflare Developer Docscf-developerskitesurf · median 33MiB · p95 33MiB · p99 33MiBcontainer · median 3MiB · p95 5MiB · p99 5MiB The Cloudflare Blogcf-blogkitesurf · median 28MiB · p95 28MiB · p99 28MiBcontainer · median 4MiB · p95 7MiB · p99 7MiB Wikipedia Portalwikipedia-portalkitesurf · median 65MiB · p95 65MiB · p99 65MiBcontainer · median 9MiB · p95 10MiB · p99 10MiB Der Spiegelspiegelkitesurf · median 25MiB · p95 46MiB · p99 46MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB El Mundoelmundokitesurf · median 12MiB · p95 12MiB · p99 12MiBcontainer · median 2MiB · p95 3MiB · p99 3MiB TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Reacttodomvc-reactkitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB TodoMVC · Vuetodomvc-vuekitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB TodoMVC · Angulartodomvc-angularkitesurf · median 11MiB · p95 11MiB · p99 11MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · mem

0MiB 24MiB 48MiB 72MiB 95MiB kitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Example Domainexample-comkitesurf · median 8MiB · p95 8MiB · p99 8MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB Hacker Newshacker-newskitesurf · median 31MiB · p95 31MiB · p99 31MiBcontainer · median 4MiB · p95 4MiB · p99 4MiB Cloudflare Developer Docscf-developerskitesurf · median 32MiB · p95 33MiB · p99 33MiBcontainer · median 3MiB · p95 5MiB · p99 5MiB The Cloudflare Blogcf-blogkitesurf · median 26MiB · p95 26MiB · p99 26MiBcontainer · median 4MiB · p95 6MiB · p99 6MiB Wikipedia Portalwikipedia-portalkitesurf · median 66MiB · p95 91MiB · p99 91MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB Der Spiegelspiegelkitesurf · median 27MiB · p95 31MiB · p99 31MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB El Mundoelmundokitesurf · median 7MiB · p95 7MiB · p99 7MiBcontainer · median 2MiB · p95 2MiB · p99 2MiB TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB TodoMVC · Reacttodomvc-reactkitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 3MiB · p95 4MiB · p99 4MiB TodoMVC · Vuetodomvc-vuekitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 9MiB · p95 9MiB · p99 9MiB TodoMVC · Angulartodomvc-angularkitesurf · median 6MiB · p95 6MiB · p99 6MiBcontainer · median 3MiB · p95 3MiB · p99 3MiB TodoMVC · Preacttodomvc-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.

screenshot

wall — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 749ms1360ms1360ms217ms228ms228ms
Hacker News hacker-news 1086ms1170ms1170ms571ms4727ms4727ms
Cloudflare Developer Docs cf-developers 1698ms2221ms2221ms499ms518ms518ms
The Cloudflare Blog cf-blog 1933ms5277ms5277ms562ms653ms653ms
Wikipedia Portal wikipedia-portal 1064ms2640ms2640ms474ms922ms922ms
Der Spiegel spiegel 1908ms3631ms3631ms869ms893ms893ms
El Mundo elmundo 1559ms4349ms4349ms877ms948ms948ms
TodoMVC · JavaScript ES6 todomvc-js-es6 636ms1586ms1586ms286ms535ms535ms
TodoMVC · React todomvc-react 655ms1631ms1631ms300ms326ms326ms
TodoMVC · Vue todomvc-vue 651ms934ms934ms324ms488ms488ms
TodoMVC · Angular todomvc-angular 664ms1006ms1006ms331ms508ms508ms
TodoMVC · Preact todomvc-preact 854ms947ms947ms302ms675ms675ms
cpu — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 75ms248ms248ms289ms311ms311ms
Hacker News hacker-news 259ms287ms287ms455ms667ms667ms
Cloudflare Developer Docs cf-developers 605ms628ms628ms981ms1033ms1033ms
The Cloudflare Blog cf-blog 370ms600ms600ms1167ms1762ms1762ms
Wikipedia Portal wikipedia-portal 464ms729ms729ms934ms959ms959ms
Der Spiegel spiegel 1008ms1392ms1392ms1694ms1883ms1883ms
El Mundo elmundo 677ms1727ms1727ms2085ms2183ms2183ms
TodoMVC · JavaScript ES6 todomvc-js-es6 80ms207ms207ms450ms484ms484ms
TodoMVC · React todomvc-react 88ms314ms314ms472ms476ms476ms
TodoMVC · Vue todomvc-vue 66ms88ms88ms474ms558ms558ms
TodoMVC · Angular todomvc-angular 71ms75ms75ms542ms561ms561ms
TodoMVC · Preact todomvc-preact 68ms76ms76ms466ms492ms492ms
mem — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 10MiB10MiB10MiB2MiB2MiB2MiB
Hacker News hacker-news 16MiB16MiB16MiB2MiB2MiB2MiB
Cloudflare Developer Docs cf-developers 33MiB33MiB33MiB4MiB4MiB4MiB
The Cloudflare Blog cf-blog 33MiB33MiB33MiB3MiB5MiB5MiB
Wikipedia Portal wikipedia-portal 28MiB28MiB28MiB4MiB7MiB7MiB
Der Spiegel spiegel 65MiB65MiB65MiB9MiB10MiB10MiB
El Mundo elmundo 25MiB46MiB46MiB9MiB9MiB9MiB
TodoMVC · JavaScript ES6 todomvc-js-es6 12MiB12MiB12MiB2MiB3MiB3MiB
TodoMVC · React todomvc-react 11MiB11MiB11MiB3MiB3MiB3MiB
TodoMVC · Vue todomvc-vue 11MiB11MiB11MiB3MiB4MiB4MiB
TodoMVC · Angular todomvc-angular 11MiB11MiB11MiB9MiB9MiB9MiB
TodoMVC · Preact todomvc-preact 11MiB11MiB11MiB3MiB3MiB3MiB

html

wall — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 716ms1129ms1129ms100ms106ms106ms
Hacker News hacker-news 942ms990ms990ms1538ms3906ms3906ms
Cloudflare Developer Docs cf-developers 1111ms4915ms4915ms399ms423ms423ms
The Cloudflare Blog cf-blog 1402ms4198ms4198ms409ms434ms434ms
Wikipedia Portal wikipedia-portal 840ms2359ms2359ms329ms391ms391ms
Der Spiegel spiegel 1919ms2428ms2428ms809ms840ms840ms
El Mundo elmundo 1988ms2116ms2116ms632ms687ms687ms
TodoMVC · JavaScript ES6 todomvc-js-es6 851ms929ms929ms175ms331ms331ms
TodoMVC · React todomvc-react 616ms870ms870ms163ms172ms172ms
TodoMVC · Vue todomvc-vue 855ms984ms984ms184ms226ms226ms
TodoMVC · Angular todomvc-angular 612ms893ms893ms209ms224ms224ms
TodoMVC · Preact todomvc-preact 816ms1613ms1613ms165ms174ms174ms
cpu — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 40ms99ms99ms200ms268ms268ms
Hacker News hacker-news 102ms135ms135ms377ms488ms488ms
Cloudflare Developer Docs cf-developers 283ms947ms947ms783ms871ms871ms
The Cloudflare Blog cf-blog 233ms586ms586ms813ms887ms887ms
Wikipedia Portal wikipedia-portal 251ms443ms443ms719ms887ms887ms
Der Spiegel spiegel 933ms1137ms1137ms1621ms1756ms1756ms
El Mundo elmundo 691ms724ms724ms1573ms1669ms1669ms
TodoMVC · JavaScript ES6 todomvc-js-es6 37ms38ms38ms296ms323ms323ms
TodoMVC · React todomvc-react 48ms50ms50ms301ms334ms334ms
TodoMVC · Vue todomvc-vue 31ms35ms35ms349ms362ms362ms
TodoMVC · Angular todomvc-angular 36ms42ms42ms402ms500ms500ms
TodoMVC · Preact todomvc-preact 56ms183ms183ms331ms334ms334ms
mem — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 6MiB6MiB6MiB2MiB2MiB2MiB
Hacker News hacker-news 8MiB8MiB8MiB2MiB2MiB2MiB
Cloudflare Developer Docs cf-developers 31MiB31MiB31MiB4MiB4MiB4MiB
The Cloudflare Blog cf-blog 32MiB33MiB33MiB3MiB5MiB5MiB
Wikipedia Portal wikipedia-portal 26MiB26MiB26MiB4MiB6MiB6MiB
Der Spiegel spiegel 66MiB91MiB91MiB9MiB9MiB9MiB
El Mundo elmundo 27MiB31MiB31MiB9MiB9MiB9MiB
TodoMVC · JavaScript ES6 todomvc-js-es6 7MiB7MiB7MiB2MiB2MiB2MiB
TodoMVC · React todomvc-react 6MiB6MiB6MiB3MiB4MiB4MiB
TodoMVC · Vue todomvc-vue 6MiB6MiB6MiB3MiB4MiB4MiB
TodoMVC · Angular todomvc-angular 6MiB6MiB6MiB9MiB9MiB9MiB
TodoMVC · Preact todomvc-preact 6MiB6MiB6MiB3MiB3MiB3MiB

History

date commit kitesurf · screenshotkitesurf · htmlcontainer · screenshotcontainer · html note
2026-07-11 17:4615ac2dc1195ms1488ms884ms589ms
2026-07-05 14:03be117861645ms1468ms915ms677msboa eval-less runtime — run page JS (Runtime.evaluate + dynamic import) without V8 code-gen-from-string @lduarte
2026-07-02 00:361f76dfb560ms547ms696ms512msReduce wasm peak memory ~23% (emoji SVG-strip + node-slab pre-size + lazy serif) @lduarte
2026-06-15 10:3678edd791008ms996ms683ms473ms
2026-06-06 10:289afdd69727ms1457ms778ms548ms
2026-06-05 15:46c8a9da7715ms597ms1080ms920msRefactor autoresearch for memory optimization + port wasm-memprof + autoresearch memory opts @lduarte
2026-06-05 15:34c8a9da7715ms597ms1080ms920msRefactor autoresearch for memory optimization + port wasm-memprof + autoresearch memory opts @lduarte
2026-06-02 09:1536cc68a950ms1060ms858ms572ms
2026-06-02 00:32bc688751088ms1234ms734ms520ms
2026-06-02 00:1584bf4a3835ms1360ms521ms356ms
2026-06-02 00:04885052c923ms1079ms693ms505ms
2026-06-01 23:56d1fa08a1173ms1182ms879ms480ms
2026-06-01 23:304e0f0e71358ms1181ms697ms460ms
2026-05-31 19:29cd6a6d51109ms869ms864ms610ms
2026-05-25 22:39caf5678633ms658ms608ms369msrerun with concurrent-producer wallMs fix
2026-05-25 21:37a4d9bf51442ms1151ms741ms410mstail-worker CPU attribution: now includes page-script wasm/JS cost
2026-05-25 11:4804351641359ms1194ms916ms618ms
2026-05-25 11:4804351641362ms1160ms823ms714ms
2026-05-25 11:4804351641215ms1020ms704ms487ms
2026-05-25 11:4804351641172ms925ms706ms394ms

Archived report (markdown)

# 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