kitesurf · bench

← back to latest

Viewing archived run 2026-05-25 · commit caf5678. 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 625ms 1250ms 1875ms 2500ms kitesurf · median 976ms · p95 1002ms · p99 1002mscontainer · median 220ms · p95 221ms · p99 221ms Example Domainexample-comkitesurf · median 1198ms · p95 1399ms · p99 1399mscontainer · median 551ms · p95 570ms · p99 570ms Hacker Newshacker-newskitesurf · median 1502ms · p95 1644ms · p99 1644mscontainer · median 549ms · p95 599ms · p99 599ms Cloudflare Developer Docscf-developerskitesurf · median 2079ms · p95 2146ms · p99 2146mscontainer · median 613ms · p95 783ms · p99 783ms The Cloudflare Blogcf-blogkitesurf · median 1426ms · p95 1442ms · p99 1442mscontainer · median 502ms · p95 532ms · p99 532ms Wikipedia Portalwikipedia-portalkitesurf · median 1059ms · p95 1955ms · p99 1955mscontainer · median 275ms · p95 314ms · p99 314ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 1067ms · p95 1088ms · p99 1088mscontainer · median 304ms · p95 318ms · p99 318ms TodoMVC · Reacttodomvc-reactkitesurf · median 1072ms · p95 1175ms · p99 1175mscontainer · median 270ms · p95 312ms · p99 312ms TodoMVC · Vuetodomvc-vuekitesurf · median 1072ms · p95 2584ms · p99 2584mscontainer · median 287ms · p95 292ms · p99 292ms TodoMVC · Angulartodomvc-angularkitesurf · median 1078ms · p95 2332ms · p99 2332mscontainer · median 263ms · p95 524ms · p99 524ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · wall

0.0ms 500ms 1000ms 1500ms 2000ms kitesurf · median 940ms · p95 969ms · p99 969mscontainer · median 95ms · p95 98ms · p99 98ms Example Domainexample-comkitesurf · median 1034ms · p95 1157ms · p99 1157mscontainer · median 409ms · p95 672ms · p99 672ms Hacker Newshacker-newskitesurf · median 1224ms · p95 3146ms · p99 3146mscontainer · median 378ms · p95 451ms · p99 451ms Cloudflare Developer Docscf-developerskitesurf · median 1624ms · p95 1722ms · p99 1722mscontainer · median 445ms · p95 534ms · p99 534ms The Cloudflare Blogcf-blogkitesurf · median 1179ms · p95 1267ms · p99 1267mscontainer · median 284ms · p95 313ms · p99 313ms Wikipedia Portalwikipedia-portalkitesurf · median 983ms · p95 1001ms · p99 1001mscontainer · median 130ms · p95 155ms · p99 155ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 758ms · p95 2185ms · p99 2185mscontainer · median 164ms · p95 166ms · p99 166ms TodoMVC · Reacttodomvc-reactkitesurf · median 979ms · p95 1030ms · p99 1030mscontainer · median 150ms · p95 177ms · p99 177ms TodoMVC · Vuetodomvc-vuekitesurf · median 1035ms · p95 2624ms · p99 2624mscontainer · median 191ms · p95 215ms · p99 215ms TodoMVC · Angulartodomvc-angularkitesurf · median 1000ms · p95 2296ms · p99 2296mscontainer · median 120ms · p95 150ms · p99 150ms 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 500ms 1000ms 1500ms 2000ms kitesurf · median 378ms · p95 391ms · p99 391mscontainer · median 296ms · p95 320ms · p99 320ms Example Domainexample-comkitesurf · median 463ms · p95 539ms · p99 539mscontainer · median 445ms · p95 522ms · p99 522ms Hacker Newshacker-newskitesurf · median 700ms · p95 784ms · p99 784mscontainer · median 1182ms · p95 1261ms · p99 1261ms Cloudflare Developer Docscf-developerskitesurf · median 651ms · p95 678ms · p99 678mscontainer · median 1125ms · p95 1217ms · p99 1217ms The Cloudflare Blogcf-blogkitesurf · median 708ms · p95 736ms · p99 736mscontainer · median 1124ms · p95 1263ms · p99 1263ms Wikipedia Portalwikipedia-portalkitesurf · median 406ms · p95 413ms · p99 413mscontainer · median 480ms · p95 601ms · p99 601ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 436ms · p95 458ms · p99 458mscontainer · median 518ms · p95 554ms · p99 554ms TodoMVC · Reacttodomvc-reactkitesurf · median 403ms · p95 435ms · p99 435mscontainer · median 468ms · p95 564ms · p99 564ms TodoMVC · Vuetodomvc-vuekitesurf · median 397ms · p95 412ms · p99 412mscontainer · median 483ms · p95 598ms · p99 598ms TodoMVC · Angulartodomvc-angularkitesurf · median 402ms · p95 438ms · p99 438mscontainer · median 437ms · p95 542ms · p99 542ms TodoMVC · Preacttodomvc-preact ks (kitesurf)ct (container)

html · cpu

0.0ms 250ms 500ms 750ms 1000ms kitesurf · median 344ms · p95 354ms · p99 354mscontainer · median 185ms · p95 191ms · p99 191ms Example Domainexample-comkitesurf · median 309ms · p95 386ms · p99 386mscontainer · median 352ms · p95 380ms · p99 380ms Hacker Newshacker-newskitesurf · median 441ms · p95 537ms · p99 537mscontainer · median 796ms · p95 940ms · p99 940ms Cloudflare Developer Docscf-developerskitesurf · median 508ms · p95 519ms · p99 519mscontainer · median 730ms · p95 1047ms · p99 1047ms The Cloudflare Blogcf-blogkitesurf · median 467ms · p95 556ms · p99 556mscontainer · median 639ms · p95 663ms · p99 663ms Wikipedia Portalwikipedia-portalkitesurf · median 357ms · p95 371ms · p99 371mscontainer · median 273ms · p95 364ms · p99 364ms TodoMVC · JavaScript ES6todomvc-js-es6kitesurf · median 240ms · p95 466ms · p99 466mscontainer · median 345ms · p95 397ms · p99 397ms TodoMVC · Reacttodomvc-reactkitesurf · median 357ms · p95 368ms · p99 368mscontainer · median 316ms · p95 431ms · p99 431ms TodoMVC · Vuetodomvc-vuekitesurf · median 360ms · p95 413ms · p99 413mscontainer · median 388ms · p95 418ms · p99 418ms TodoMVC · Angulartodomvc-angularkitesurf · median 360ms · p95 393ms · p99 393mscontainer · median 245ms · p95 299ms · p99 299ms 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-25 · 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 976ms1002ms1002ms220ms221ms221ms
Hacker News hacker-news 1198ms1399ms1399ms551ms570ms570ms
Cloudflare Developer Docs cf-developers 1502ms1644ms1644ms549ms599ms599ms
The Cloudflare Blog cf-blog 2079ms2146ms2146ms613ms783ms783ms
Wikipedia Portal wikipedia-portal 1426ms1442ms1442ms502ms532ms532ms
TodoMVC · JavaScript ES6 todomvc-js-es6 1059ms1955ms1955ms275ms314ms314ms
TodoMVC · React todomvc-react 1067ms1088ms1088ms304ms318ms318ms
TodoMVC · Vue todomvc-vue 1072ms1175ms1175ms270ms312ms312ms
TodoMVC · Angular todomvc-angular 1072ms2584ms2584ms287ms292ms292ms
TodoMVC · Preact todomvc-preact 1078ms2332ms2332ms263ms524ms524ms
cpu — screenshot
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 378ms391ms391ms296ms320ms320ms
Hacker News hacker-news 463ms539ms539ms445ms522ms522ms
Cloudflare Developer Docs cf-developers 700ms784ms784ms1182ms1261ms1261ms
The Cloudflare Blog cf-blog 651ms678ms678ms1125ms1217ms1217ms
Wikipedia Portal wikipedia-portal 708ms736ms736ms1124ms1263ms1263ms
TodoMVC · JavaScript ES6 todomvc-js-es6 406ms413ms413ms480ms601ms601ms
TodoMVC · React todomvc-react 436ms458ms458ms518ms554ms554ms
TodoMVC · Vue todomvc-vue 403ms435ms435ms468ms564ms564ms
TodoMVC · Angular todomvc-angular 397ms412ms412ms483ms598ms598ms
TodoMVC · Preact todomvc-preact 402ms438ms438ms437ms542ms542ms
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 940ms969ms969ms95ms98ms98ms
Hacker News hacker-news 1034ms1157ms1157ms409ms672ms672ms
Cloudflare Developer Docs cf-developers 1224ms3146ms3146ms378ms451ms451ms
The Cloudflare Blog cf-blog 1624ms1722ms1722ms445ms534ms534ms
Wikipedia Portal wikipedia-portal 1179ms1267ms1267ms284ms313ms313ms
TodoMVC · JavaScript ES6 todomvc-js-es6 983ms1001ms1001ms130ms155ms155ms
TodoMVC · React todomvc-react 758ms2185ms2185ms164ms166ms166ms
TodoMVC · Vue todomvc-vue 979ms1030ms1030ms150ms177ms177ms
TodoMVC · Angular todomvc-angular 1035ms2624ms2624ms191ms215ms215ms
TodoMVC · Preact todomvc-preact 1000ms2296ms2296ms120ms150ms150ms
cpu — html
page slug ks medianks p95ks p99ct medianct p95ct p99
Example Domain example-com 344ms354ms354ms185ms191ms191ms
Hacker News hacker-news 309ms386ms386ms352ms380ms380ms
Cloudflare Developer Docs cf-developers 441ms537ms537ms796ms940ms940ms
The Cloudflare Blog cf-blog 508ms519ms519ms730ms1047ms1047ms
Wikipedia Portal wikipedia-portal 467ms556ms556ms639ms663ms663ms
TodoMVC · JavaScript ES6 todomvc-js-es6 357ms371ms371ms273ms364ms364ms
TodoMVC · React todomvc-react 240ms466ms466ms345ms397ms397ms
TodoMVC · Vue todomvc-vue 357ms368ms368ms316ms431ms431ms
TodoMVC · Angular todomvc-angular 360ms413ms413ms388ms418ms418ms
TodoMVC · Preact todomvc-preact 360ms393ms393ms245ms299ms299ms
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-25

commit: `caf5678` · backends: kitesurf, container · endpoints: screenshot, html · runs/combo: 5 (+ 2 warmup)
target: https://kitesurf-bench.rendering.cfdata.org

> rerun with concurrent-producer wallMs fix

## Summary (median wall time)

| Page | kitesurf/screenshot | kitesurf/html | container/screenshot | container/html |
|---|--:|--:|--:|--:|
| Example Domain | 526ms | 520ms | 274ms | 154ms |
| Hacker News | 662ms | 653ms | 672ms | 480ms |
| Cloudflare Developer Docs | 760ms | 746ms | 645ms | 449ms |
| The Cloudflare Blog | 1507ms | 1188ms | 741ms | 514ms |
| Wikipedia Portal | 633ms | 658ms | 608ms | 369ms |
| TodoMVC · JavaScript ES6 | 581ms | 545ms | 358ms | 183ms |
| TodoMVC · React | 567ms | 438ms | 365ms | 218ms |
| TodoMVC · Vue | 585ms | 572ms | 352ms | 202ms |
| TodoMVC · Angular | 599ms | 597ms | 349ms | 243ms |
| TodoMVC · Preact | 558ms | 571ms | 348ms | 188ms |

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