kitesurf · bench

← back to latest

Viewing archived run 2026-05-31 · commit cd6a6d5. 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 668ms · p95 674ms · p99 674mscontainer · median 315ms · p95 341ms · p99 341ms Example Domainexample-comkitesurf · median 903ms · p95 925ms · p99 925mscontainer · median 645ms · p95 712ms · p99 712ms Hacker Newshacker-newskitesurf · median 1224ms · p95 1362ms · p99 1362mscontainer · median 1006ms · p95 1063ms · p99 1063ms Cloudflare Developer Docscf-developerskitesurf · median 1513ms · p95 1621ms · p99 1621mscontainer · median 959ms · p95 1068ms · p99 1068ms The Cloudflare Blogcf-blogkitesurf · median 1131ms · p95 1145ms · p99 1145mscontainer · median 685ms · p95 775ms · p99 775ms Wikipedia Portalwikipedia-portalkitesurf · median 723ms · p95 750ms · p99 750mscontainer · median 404ms · p95 437ms · p99 437ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 761ms · p95 1863ms · p99 1863mscontainer · median 420ms · p95 436ms · p99 436ms TodoMVC · Reacttodomvc-reactkitesurf · median 817ms · p95 2081ms · p99 2081mscontainer · median 422ms · p95 423ms · p99 423ms TodoMVC · Vuetodomvc-vuekitesurf · median 908ms · p95 920ms · p99 920mscontainer · median 482ms · p95 524ms · p99 524ms TodoMVC · Angulartodomvc-angularkitesurf · median 731ms · p95 1688ms · p99 1688mscontainer · median 394ms · p95 417ms · p99 417ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · wall

0.0ms 500ms 1000ms 1500ms 2000ms kitesurf · median 657ms · p95 680ms · p99 680mscontainer · median 147ms · p95 150ms · p99 150ms Example Domainexample-comkitesurf · median 832ms · p95 864ms · p99 864mscontainer · median 483ms · p95 742ms · p99 742ms Hacker Newshacker-newskitesurf · median 1144ms · p95 1168ms · p99 1168mscontainer · median 658ms · p95 800ms · p99 800ms Cloudflare Developer Docscf-developerskitesurf · median 1404ms · p95 3560ms · p99 3560mscontainer · median 742ms · p95 815ms · p99 815ms The Cloudflare Blogcf-blogkitesurf · median 935ms · p95 955ms · p99 955mscontainer · median 455ms · p95 512ms · p99 512ms Wikipedia Portalwikipedia-portalkitesurf · median 687ms · p95 696ms · p99 696mscontainer · median 222ms · p95 270ms · p99 270ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 706ms · p95 714ms · p99 714mscontainer · median 256ms · p95 276ms · p99 276ms TodoMVC · Reacttodomvc-reactkitesurf · median 760ms · p95 1876ms · p99 1876mscontainer · median 279ms · p95 302ms · p99 302ms TodoMVC · Vuetodomvc-vuekitesurf · median 877ms · p95 885ms · p99 885mscontainer · median 297ms · p95 321ms · p99 321ms TodoMVC · Angulartodomvc-angularkitesurf · median 687ms · p95 1673ms · p99 1673mscontainer · median 210ms · p95 215ms · p99 215ms 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 234ms · p95 239ms · p99 239mscontainer · median 492ms · p95 527ms · p99 527ms Example Domainexample-comkitesurf · median 324ms · p95 338ms · p99 338mscontainer · median 645ms · p95 823ms · p99 823ms Hacker Newshacker-newskitesurf · median 620ms · p95 760ms · p99 760mscontainer · median 2243ms · p95 2417ms · p99 2417ms Cloudflare Developer Docscf-developerskitesurf · median 481ms · p95 491ms · p99 491mscontainer · median 2027ms · p95 2273ms · p99 2273ms The Cloudflare Blogcf-blogkitesurf · median 458ms · p95 499ms · p99 499mscontainer · median 1607ms · p95 1840ms · p99 1840ms Wikipedia Portalwikipedia-portalkitesurf · median 253ms · p95 262ms · p99 262mscontainer · median 845ms · p95 918ms · p99 918ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 276ms · p95 459ms · p99 459mscontainer · median 906ms · p95 945ms · p99 945ms TodoMVC · Reacttodomvc-reactkitesurf · median 325ms · p95 460ms · p99 460mscontainer · median 904ms · p95 992ms · p99 992ms TodoMVC · Vuetodomvc-vuekitesurf · median 406ms · p95 412ms · p99 412mscontainer · median 964ms · p95 1110ms · p99 1110ms TodoMVC · Angulartodomvc-angularkitesurf · median 263ms · p95 346ms · p99 346mscontainer · median 855ms · p95 978ms · p99 978ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · cpu

0.0ms 500ms 1000ms 1500ms 2000ms kitesurf · median 216ms · p95 221ms · p99 221mscontainer · median 298ms · p95 322ms · p99 322ms Example Domainexample-comkitesurf · median 238ms · p95 270ms · p99 270mscontainer · median 482ms · p95 667ms · p99 667ms Hacker Newshacker-newskitesurf · median 535ms · p95 537ms · p99 537mscontainer · median 1404ms · p95 1793ms · p99 1793ms Cloudflare Developer Docscf-developerskitesurf · median 383ms · p95 643ms · p99 643mscontainer · median 1545ms · p95 1795ms · p99 1795ms The Cloudflare Blogcf-blogkitesurf · median 282ms · p95 312ms · p99 312mscontainer · median 1082ms · p95 1172ms · p99 1172ms Wikipedia Portalwikipedia-portalkitesurf · median 229ms · p95 239ms · p99 239mscontainer · median 472ms · p95 606ms · p99 606ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 232ms · p95 238ms · p99 238mscontainer · median 568ms · p95 603ms · p99 603ms TodoMVC · Reacttodomvc-reactkitesurf · median 273ms · p95 383ms · p99 383mscontainer · median 640ms · p95 789ms · p99 789ms TodoMVC · Vuetodomvc-vuekitesurf · median 370ms · p95 381ms · p99 381mscontainer · median 657ms · p95 704ms · p99 704ms TodoMVC · Angulartodomvc-angularkitesurf · median 219ms · p95 348ms · p99 348mscontainer · median 455ms · p95 465ms · p99 465ms 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

no recorded data for screenshot.

html · mem

no recorded data for html.

Run 2026-05-31 · 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 668ms674ms674ms315ms341ms341ms
Hacker News hacker-news 903ms925ms925ms645ms712ms712ms
Cloudflare Developer Docs cf-developers 1224ms1362ms1362ms1006ms1063ms1063ms
The Cloudflare Blog cf-blog 1513ms1621ms1621ms959ms1068ms1068ms
Wikipedia Portal wikipedia-portal 1131ms1145ms1145ms685ms775ms775ms
TodoMVC · JavaScript ES6 todomvc-js-es6 723ms750ms750ms404ms437ms437ms
TodoMVC · React todomvc-react 761ms1863ms1863ms420ms436ms436ms
TodoMVC · Vue todomvc-vue 817ms2081ms2081ms422ms423ms423ms
TodoMVC · Angular todomvc-angular 908ms920ms920ms482ms524ms524ms
TodoMVC · Preact todomvc-preact 731ms1688ms1688ms394ms417ms417ms
cpu — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 234ms239ms239ms492ms527ms527ms
Hacker News hacker-news 324ms338ms338ms645ms823ms823ms
Cloudflare Developer Docs cf-developers 620ms760ms760ms2243ms2417ms2417ms
The Cloudflare Blog cf-blog 481ms491ms491ms2027ms2273ms2273ms
Wikipedia Portal wikipedia-portal 458ms499ms499ms1607ms1840ms1840ms
TodoMVC · JavaScript ES6 todomvc-js-es6 253ms262ms262ms845ms918ms918ms
TodoMVC · React todomvc-react 276ms459ms459ms906ms945ms945ms
TodoMVC · Vue todomvc-vue 325ms460ms460ms904ms992ms992ms
TodoMVC · Angular todomvc-angular 406ms412ms412ms964ms1110ms1110ms
TodoMVC · Preact todomvc-preact 263ms346ms346ms855ms978ms978ms
mem — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com
Hacker News hacker-news
Cloudflare Developer Docs cf-developers
The Cloudflare Blog cf-blog
Wikipedia Portal wikipedia-portal
TodoMVC · JavaScript ES6 todomvc-js-es6
TodoMVC · React todomvc-react
TodoMVC · Vue todomvc-vue
TodoMVC · Angular todomvc-angular
TodoMVC · Preact todomvc-preact

html

wall — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 657ms680ms680ms147ms150ms150ms
Hacker News hacker-news 832ms864ms864ms483ms742ms742ms
Cloudflare Developer Docs cf-developers 1144ms1168ms1168ms658ms800ms800ms
The Cloudflare Blog cf-blog 1404ms3560ms3560ms742ms815ms815ms
Wikipedia Portal wikipedia-portal 935ms955ms955ms455ms512ms512ms
TodoMVC · JavaScript ES6 todomvc-js-es6 687ms696ms696ms222ms270ms270ms
TodoMVC · React todomvc-react 706ms714ms714ms256ms276ms276ms
TodoMVC · Vue todomvc-vue 760ms1876ms1876ms279ms302ms302ms
TodoMVC · Angular todomvc-angular 877ms885ms885ms297ms321ms321ms
TodoMVC · Preact todomvc-preact 687ms1673ms1673ms210ms215ms215ms
cpu — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 216ms221ms221ms298ms322ms322ms
Hacker News hacker-news 238ms270ms270ms482ms667ms667ms
Cloudflare Developer Docs cf-developers 535ms537ms537ms1404ms1793ms1793ms
The Cloudflare Blog cf-blog 383ms643ms643ms1545ms1795ms1795ms
Wikipedia Portal wikipedia-portal 282ms312ms312ms1082ms1172ms1172ms
TodoMVC · JavaScript ES6 todomvc-js-es6 229ms239ms239ms472ms606ms606ms
TodoMVC · React todomvc-react 232ms238ms238ms568ms603ms603ms
TodoMVC · Vue todomvc-vue 273ms383ms383ms640ms789ms789ms
TodoMVC · Angular todomvc-angular 370ms381ms381ms657ms704ms704ms
TodoMVC · Preact todomvc-preact 219ms348ms348ms455ms465ms465ms
mem — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com
Hacker News hacker-news
Cloudflare Developer Docs cf-developers
The Cloudflare Blog cf-blog
Wikipedia Portal wikipedia-portal
TodoMVC · JavaScript ES6 todomvc-js-es6
TodoMVC · React todomvc-react
TodoMVC · Vue todomvc-vue
TodoMVC · Angular todomvc-angular
TodoMVC · Preact todomvc-preact

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-05-31

commit: `cd6a6d5` · 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 | 633ms | 621ms | 455ms | 261ms |
| Hacker News | 872ms | 798ms | 857ms | 615ms |
| Cloudflare Developer Docs | 1196ms | 1116ms | 1141ms | 853ms |
| The Cloudflare Blog | 1483ms | 1369ms | 1157ms | 872ms |
| Wikipedia Portal | 1109ms | 869ms | 864ms | 610ms |
| TodoMVC · JavaScript ES6 | 701ms | 650ms | 580ms | 358ms |
| TodoMVC · React | 728ms | 670ms | 549ms | 372ms |
| TodoMVC · Vue | 785ms | 725ms | 545ms | 390ms |
| TodoMVC · Angular | 876ms | 844ms | 629ms | 419ms |
| TodoMVC · Preact | 679ms | 651ms | 539ms | 325ms |

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