Measured / Forma 3.0.0
Numbers you can
look behind.
Production fixtures. Named workloads. Published evidence. Performance depends on what you build; these results show what we measured, with the boundaries left visible.
Forma browser fixture
61,190 B for React + Compiler in the same comparison. Fixture payload, not universal app size.
Update all 500 widgets
Chromium median committed DOM work. Forma p95 0.318 ms; React + Compiler median 1.031 ms.
Native render walk · p50
15,053 nodes, 396,553 HTML bytes. p99 3.278 ms. Prepared inputs; no HTTP or database time.
The browser fixture
Both implementations use production builds. React Compiler output was verified. The comparison includes the JavaScript needed by each fixture; it is not a package-size scoreboard.
All recorded runtime workloads
Milliseconds. Script time includes synchronous committed DOM work. Settled time includes two requestAnimationFrame boundaries. Very small update timings are normalized across repeated operations, not isolated clock-resolution measurements. Playwright WebKit is not a Safari device measurement.
| Engine | Workload | Forma median | Forma p95 | React median | React p95 | Forma settled | React settled |
|---|---|---|---|---|---|---|---|
| chromium 156.0.8078.4 | mount 1 | 0.160 | 0.255 | 0.260 | 0.350 | 32.145 | 32.430 |
| chromium 156.0.8078.4 | mount 50 | 0.490 | 0.990 | 0.650 | 1.075 | 32.210 | 32.360 |
| chromium 156.0.8078.4 | mount 100 | 0.680 | 0.780 | 0.835 | 1.125 | 32.275 | 32.485 |
| chromium 156.0.8078.4 | mount 500 | 2.840 | 3.700 | 3.260 | 5.045 | 32.175 | 32.440 |
| chromium 156.0.8078.4 | update one of 500 | 0.000602 | 0.000865 | 0.042601 | 0.045279 | 31.645 | 214.910 |
| chromium 156.0.8078.4 | update all 500 | 0.296 | 0.318 | 1.031 | 1.105 | 30.920 | 30.480 |
| chromium 156.0.8078.4 | reverse 1000 | 1.319 | 1.441 | 3.426 | 7.093 | 23.160 | 44.125 |
| firefox 157.0 | mount 1 | 0.200 | 0.460 | 0.520 | 0.800 | 31.400 | 31.560 |
| firefox 157.0 | mount 50 | 0.760 | 1.320 | 1.200 | 2.940 | 31.400 | 31.440 |
| firefox 157.0 | mount 100 | 1.080 | 2.360 | 1.720 | 4.480 | 31.440 | 31.400 |
| firefox 157.0 | mount 500 | 4.340 | 8.080 | 9.480 | 16.900 | 31.260 | 31.140 |
| firefox 157.0 | update one of 500 | 0.000976 | 0.001192 | 0.086808 | 0.089044 | 29.820 | 446.360 |
| firefox 157.0 | update all 500 | 0.476 | 0.694 | 1.996 | 2.243 | 29.780 | 47.600 |
| firefox 157.0 | reverse 1000 | 2.716 | 3.224 | 7.626 | 10.020 | 40.980 | 92.640 |
| Playwright WebKit 27.2 | mount 1 | 0.200 | 0.440 | 0.480 | 0.860 | 31.020 | 31.020 |
| Playwright WebKit 27.2 | mount 50 | 0.640 | 1.260 | 0.880 | 1.640 | 30.860 | 30.920 |
| Playwright WebKit 27.2 | mount 100 | 0.880 | 1.100 | 1.400 | 1.660 | 31.020 | 30.880 |
| Playwright WebKit 27.2 | mount 500 | 3.160 | 4.320 | 4.000 | 7.920 | 30.920 | 30.880 |
| Playwright WebKit 27.2 | update one of 500 | 0.000580 | 0.001060 | 0.041836 | 0.043812 | 30.360 | 210.900 |
| Playwright WebKit 27.2 | update all 500 | 0.267 | 0.433 | 0.946 | 1.013 | 29.340 | 35.540 |
| Playwright WebKit 27.2 | reverse 1000 | 2.072 | 2.766 | 5.090 | 5.566 | 43.180 | 73.280 |
Read the method before the ratio
- Recorded October 20, 2026 from source
2006423b21fe0f8dd5a510bd09bfe3b8748327a5. - Forma 3.0.0 packed core; React/react-dom 19.2.8; React Compiler 1.0.0.
- Linux x64; AMD EPYC 9V74; four allocated logical CPUs; approximately 16 GiB memory; Node 24.22.0.
- Each framework runs in an isolated warmed page. Browser engines run serially. React state updates use flushSync to include commit work.
- The native renderer result uses 20,000 measured walks. Input parsing/projection, response assembly, HTTP, networking and database work are outside that timer.
State decoding and mobile interaction
A demanding 1 MiB state block containing 20,000 strings measured 18.05 ms median, 21.6 ms p95 and 23.2 ms maximum at 4× CPU slowdown in Chromium. This includes activation up to component entry, with pollution-key stripping and schema checks enabled: 40 fresh-document samples after five warmups.
The release’s 40 independent mobile probes observed zero long tasks and zero input errors across the login and 100-island routes. Whole browser traces retained rendering/internal outliers. This is not a claim that every browser task in every trace stayed below 50 ms.
Inspect and reproduce
The full comparison JSON below also includes memory observations and server-state experiments. The complete P17 aggregate retains release qualification and raw measurement data.
Use the performance protocol and runner source. The browser runner requires FORMA_BENCH_CORE to point to the verified extracted packed core; source-only substitutes are refused.
node e2e/performance/client/run.mjs --browser allHardware, browser versions, power state and application workloads affect results. These measurements describe these fixtures on this runner. The earlier Preact proof-of-concept did not retain enough comparable provenance for a current 3.0 marketing claim.