Proa renders typed Rust components to HTML on the server, streams them, and hydrates fine-grained browser islands. This page shows what one core serves over HTTP, how fast seventeen renderers render those pages, and how to reproduce them.
The SvelteKit comparison adds production HTTP, cold-start, product-scaling, and browser-complete streaming measurements. Native SvelteKit promise streaming sends data for the browser to render; its response end is a different boundary from Proa’s resolved-HTML stream.
If you see an issue with the benchmarks or would like to add any, please open an issue!
|
Renderer-only benchmark across three canonical pages: component, table, and product grid. Seventeen renderers, one-core P50 multiples on log scale. Details · Full size · how the figures are built |
|
|
Three sample pages, one core each: throughput at saturation, latency at a fixed request rate. Three parity-gated pages on loopback HTTP, one core per engine. Details · Full size · how the figures are built |
Legacy one-core mechanism view: workload speed vs Proa memcpy floor. Three workloads + allocation context as multiples of a memcpy baseline. Details · Full size · how the figures are built |
|
Single-core Suspense streaming with eight async boundaries per request. Four engines on shared throughput, memory, and latency scales. Marko/React source · Proa/SvelteKit source. SvelteKit response end excludes browser rendering; see complete-DOM timings. Full size · how the figures are built |
Single-core P50 and P95 for the same three canonical workloads. Tail spread with heavy-tail markers on three workloads. Details · Full size · how the figures are built |
|
Proa-only linked pages: five runs each, with render range and size. Application-like page samples and stability notes. Details · Full size · how the figures are built |
Startup latency from process creation to first byte-identical response. Median, P95, and worst-start across 15 fresh processes. Details · Full size · how the figures are built |
Install the JavaScript dependencies once. You need Node.js 24.20.0 exactly — the canonical runner compares process.version and refuses to run on anything else — with pnpm, the Rust toolchain in rust-toolchain.toml, and Go 1.25. The full scoreboard also needs Ruby 3.2+, a JDK 17+ with Gradle, PHP 8, and Python 3.13+.
pnpm install --frozen-lockfile
pnpm exec playwright install chromium
npm ci --prefix rendering/external/react
npm ci --prefix rendering/external/marko
npm ci --prefix rendering/external/handlebars
npm ci --prefix rendering/external/svelte
npm ci --prefix rendering/external/sveltekitRun timed suites sequentially. The runners build their servers, gate parity before timing, and reject a phase whose load generator was the bottleneck. The report commands regenerate the evidence pages and figures.
./rendering/run-all # scoreboard: build, parity-gate, time, regenerate scoreboard.md
pnpm run bench:page-load # canonical pages over HTTP, one core each
pnpm run bench:cold-start # cold start to first response
pnpm run bench:suspense-load # Suspense streaming over HTTP
node sveltekit/run.mjs # Proa vs SvelteKit HTTP streaming + browser completion
node sveltekit/report.mjs # regenerate SvelteKit comparison
pnpm run refresh # regenerate every evidence page and figure from the capturesGood to know: the committed numbers are dated evidence from one machine, not universal claims. Rerun the relevant suite before publishing a current comparison.
- Proa versus SvelteKit
- Static SSR, scaling, HTTP, cold starts, and async streaming, with native data streaming and buffered HTML reported separately.
- HTTP capacity, cold start and streaming
- Sustained responses per second, CPU per response, latency at equal load, and cold start for five production servers.
- Canonical scoreboard evidence
- The seventeen-renderer table, parity coverage, every retained percentile, and the adapters side by side.
- Engineering, application and agent captures
- Product-grid scaling, the memcpy floor, Proa's buffer allocation, client JavaScript, and the archived August report.
- Benchmark figures
- How every SVG is drawn from the evidence pages' own tables and checked against them.
- Canonical benchmark protocol
- The fairness rules, workload shapes, and parity gate in full.
- Suite READMEs:
rendering/,page-load/,suspense-load/,sveltekit/,load/,showcase/,agent-chain/, and the separatetravel-agent/control.
This repository is Apache-2.0; see LICENSE. Benchmark adapters incorporate upstream work under its own terms, recorded in rendering/UPSTREAM_LICENSES.md.
React, Marko, Vue, Svelte, SvelteKit, Rails, jte, Rocker, Handlebars, Go, Jinja2, PHP, Askama, Sailfish, Leptos, Dioxus, and Topcoat belong to their respective owners. They appear here as the subjects of a benchmark; their inclusion implies no endorsement.