Render time comparison
The same request data rendered in this server process by all three renderers, after a warm-up.
Times are for the render call alone (performance.now()), interleaved per input so the three see the same
machine load. A specialized renderer that meets data it was not specialized for hands that request to React; the
“fell back” column is the share of inputs where that happened (the HTML is identical either way).
Store pages · 200 inputs × 5 rounds
random live requests: home, categories, search, product pages, cart, sign-in, 404
| renderer | median | p90 | mean | speedup | fell back to React | |
|---|---|---|---|---|---|---|
| React | 182.2 µs | 482.8 µs | 245.6 µs | 1.00× | – | |
| Prepack | 40.5 µs | 100.8 µs | 47.8 µs | 4.50× | 0.0% (0/200) | |
| Hybrid | 35.0 µs | 94.1 µs | 50.9 µs | 5.21× | 0.0% (0/200) |
HTML byte-identical across all three: 200/200 inputs
Whole catalog · 5 inputs × 5 rounds
the “View all” listing: 192 products, ~300 KB of HTML
| renderer | median | p90 | mean | speedup | fell back to React | |
|---|---|---|---|---|---|---|
| React | 3.00 ms | 4.94 ms | 3.36 ms | 1.00× | – | |
| Prepack | 529.4 µs | 641.7 µs | 553.6 µs | 5.66× | 0.0% (0/5) | |
| Hybrid | 530.2 µs | 590.1 µs | 534.2 µs | 5.65× | 0.0% (0/5) |
HTML byte-identical across all three: 5/5 inputs
Measured in 1.9 s on 8 vCPUs, Node v26.7.0. About this demo · Open the store