Web framework benchmarks

SSR render latency in microseconds across workloads. Select a column heading to sort.
Renderer
AstroNot measured— No canonical capture. Its asynchronous server renderer needs a separately defined measurement boundary. Details ↗ · Measured in Framework SSR ↗
ExactNot measured— No canonical capture. Current Contract markup does not satisfy the existing DOM/class parity contract. Details ↗ · Measured in Framework SSR ↗
Next.jsNot measured— No canonical capture. A production framework SSR adapter needs a separately defined measurement boundary. Details ↗ · Measured in Framework SSR ↗
SvelteKitNot measured— Measured in HTTP/startup; no capture in the pure-renderer contract. Details ↗
Median SSR render latency · µs · lower is better · sort by any workload heading · bars scale linearly within each column
4 roster entries not measured here
Method & data

Prepared data → a complete, freshly owned HTML output. Each adapter uses its declared native output type; Proa may return a RenderBuffer without String conversion. Includes rendering, formatting, and output allocation. Excludes data setup, HTTP, routing, databases, hydration, and network transfer. All captured semantic DOM parity cells passed.

Five independent processes. Bars show the median process P50; boxes summarize those five process medians, not individual render latency.

Recorded versions
Proa
0.4.0 @ bbbc9684335109949257eea8b4c98bb7bc8572ae / rustc 1.95.0 (59807616e 2026-04-14)
Marko
6.0.150 / Node v24.20.0
React
19.2.4 / Node v24.20.0
Vue
3.5.42 / Node v24.20.0
Svelte
5.57.2 / Node v24.20.0
Rails
Rails 8.1.3.1 / ruby 4.0.6 (2026-07-14 revision 03b6d3f889) +PRISM [arm64-darwin25]
jte
3.2.4 / openjdk 25.0.1 2025-10-21
Rocker
2.4.0 / openjdk 25.0.1 2025-10-21
Handlebars
4.7.8 / Node v24.20.0
Go html/template
go version go1.25.5 darwin/arm64
Jinja2
3.1.6 / Python 3.14.2
PHP
PHP 8.5.9 (cli) (built: Jul 28 2026 13:06:52) (NTS)
Askama
0.15.6 / rustc 1.95.0 (59807616e 2026-04-14)
Sailfish
0.10.2 / rustc 1.95.0 (59807616e 2026-04-14)
Leptos
0.7.8 / rustc 1.95.0 (59807616e 2026-04-14)
Dioxus
0.6.3 + dioxus-ssr 0.6.2 / rustc 1.95.0 (59807616e 2026-04-14)
Topcoat
0.3.1 / rustc 1.95.0 (59807616e 2026-04-14)
Playwright
1.61.1
Chromium
149.0.7827.55
JSONCSV

Original capture ↗ · View source ↗
Source SHA-256 75b6b3a8738007f53f34472b068aa20bcbcb7b79266063b0d52a5546a4eb5d56 · Artifact SHA-256 802a3b79b436e1f560da5b8a1e2e1e642c5740b7803bf58c57015c1ba7909ef6
Renderer-only latency excludes routing, middleware, databases, HTTP transfer, hydration, and network latency. Semantic DOM parity permits documented serializer metadata and whitespace differences; payload deltas remain visible. This capture describes one machine and these three workloads; it is not a universal application ranking. Only Proa was rerun on 2026-11-11; every peer retains its 2026-10-21 measurement and version. These are different capture dates on the same machine. Proa returns a fresh owned RenderBuffer; its page-to-String conversion is excluded. Peer outputs and timings are unchanged.

Maintained by Andrew Hariri, founder of Proa Labs. Proa is included in the comparisons. Each experiment identifies its recorded host, source and capture date. Some captures include uncommitted source changes. No external database is included.

Workload preview

Open full page ↗

Tags shown as text, such as <b>plain text</b>, intentionally test that dynamic data is escaped safely. Preview styling and images are outside the timed benchmark.