Seven-framework baseline with Leptos

20260923-seven-framework-baseline · complete

Download complete JSON record

Measurements

Research and decisions

Seven-framework baseline with Leptos 0.8.20decision · 2026-09-23T22:46:54.631Z
This is the first full seven-framework run, selected before measurement. It adds Leptos 0.8.20 to the existing six production applications. The six-framework 20260922-baseline record and its raw evidence remain unchanged. This run measures commit 47660e5 plus the local benchmark integration; it is a new reference, not an isolated test of a Fusor optimization.

Build: release profile, Binaryen 132 -O3, wasm-bindgen 0.2.117, stripped Wasm names, installed Chrome, and BENCH_SEED=20261004. Both Rust frameworks use the same optimization flags. Leptos lives in an isolated Cargo workspace. SSR uses its official in-order HTML stream collected into a complete string; the methodology documents the direct-string-renderer hydration issue encountered during integration.

All 133 timing metrics, seven memory profiles, and 21 bundle fixtures passed the evaluator. Source and production artifact receipts matched before and after measurement. A separate validation also passed Leptos mount/unmount, keyed edits, event dispatch, server-node-preserving hydration, Hello World, and Todo CRUD/filter behavior in Chromium, Firefox, and WebKit; see browser-validation.json.

Leptos has tradeoffs in these workloads: its 10k keyed swap was 0.40 ms and hydration was 28.80 ms, while its 10k shared-source fan-out was 215.50 ms (2.30 ms for 1k). Those are results for these implementations and operations, not a general ranking of applications. Its gzip fixtures were 25.5 KiB (Hello), 63.3 KiB (Todo), and 68.8 KiB (benchmark).

All frameworks returned to the baseline DOM-node count after each cleanup cycle. Leptos retained approximately 7.00 MiB of additional JS heap and 130.25 MiB of Wasm capacity after the large allocation and repeated cycles; Fusor retained approximately 3.50 MiB and 167.56 MiB respectively. Wasm capacity is reserved capacity, not live Rust allocations. These figures do not measure whole-process memory or prove absence of leaks.

Limits: one local Apple M4 Pro, no CPU/network throttling or thermal controls, Chromium timing results, and 15 samples with the maximum as P95. Startup uses fresh browser contexts with a reused browser process. Values below 0.10 ms are below the browser clock floor. The idle development server remained running; builds and other benchmark processes were finished before measurement. Different framework orders, source versions and implementation changes limit direct comparisons with the older run.

Recorded 2026-09-23T22:39:55.622Z on Apple M4 Pro, darwin 24.5.0, browser 153.0.8010.53, 15 samples after 3 warmups.

Median milliseconds:

| Metric | fusor | react | svelte | solid | vue | preact | leptos |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| ssr-1000 | 0.33 | 0.89 | 0.35 | 0.30 | 1.03 | 0.89 | 0.44 |
| ssr-10000 | 2.76 | 12.86 | 4.62 | 2.94 | 9.47 | 14.69 | 4.99 |
| initial-1000 | 3.20 | 1.90 | 4.00 | 1.10 | 3.40 | 2.80 | 3.20 |
| initial-10000 | 32.10 | 19.00 | 129.80 | 11.10 | 37.60 | 30.10 | 32.90 |
| single | <0.10 | 0.70 | 0.60 | <0.10 | <0.10 | <0.10 | <0.10 |
| bulk-1000 | 0.50 | 1.80 | 1.30 | 0.40 | 2.00 | 1.60 | 0.60 |
| bulk-10000 | 3.90 | 9.90 | 8.00 | 4.00 | 18.00 | 17.20 | 5.00 |
| insert | 2.10 | 2.00 | 11.20 | 0.30 | 7.50 | 3.00 | 0.40 |
| delete | 2.10 | 1.80 | 10.10 | 0.20 | 7.40 | 3.30 | 0.40 |
| swap | 1.30 | 108.00 | 10.90 | 0.70 | 5.10 | 3.10 | 0.40 |
| computed | <0.10 | 0.80 | 0.40 | <0.10 | <0.10 | <0.10 | <0.10 |
| fanout-1000 | 0.30 | 0.90 | 0.30 | 0.20 | 1.80 | 1.30 | 2.30 |
| fanout-10000 | 4.10 | 9.40 | 3.80 | 3.50 | 23.90 | 15.70 | 215.50 |
| fanin | 0.50 | 0.10 | 4.20 | 0.50 | 4.00 | 0.10 | 1.00 |
| unmount | 5.50 | 5.20 | 3.10 | 1.20 | 5.20 | 2.20 | 7.20 |
| events | 15.50 | 45.70 | 27.20 | 20.60 | 38.30 | 29.80 | 16.00 |
| hydration-1000 | 9.60 | 6.30 | 10.30 | 3.80 | 9.50 | 7.20 | 5.80 |
| hydration-10000 | 40.30 | 110.00 | 126.10 | 20.90 | 42.60 | 85.60 | 28.80 |
| startup | 28.70 | 23.10 | 19.20 | 10.10 | 18.20 | 13.30 | 18.90 |

Gzip KiB per fixture:

| Fixture | fusor | react | svelte | solid | vue | preact | leptos |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| benchmark workload | 105.0 | 67.4 | 14.5 | 6.1 | 26.3 | 8.5 | 68.8 |
| hello | 54.0 | 66.3 | 9.2 | 4.0 | 23.2 | 4.9 | 25.5 |
| todo | 100.2 | 67.1 | 13.9 | 6.8 | 25.2 | 6.3 | 63.3 |