Benchmarks
Benchmark score in milliseconds per operation — lower is better. Every chart is the checked-in baseline from the repo’s own suites: same apps, same hardware, same run. Every primary React comparison uses the official React Compiler; memo-wall also shows an explicitly uncompiled control. Reproduce them with pnpm bench:all, and see benchmarks/ for what each suite measures.
Every suite at a glance
Start here: each cell is the geometric mean of that suite’s per-operation scores relative to Octane — 1× is Octane, below 1× is faster than Octane. Pick frameworks and a suite for the bar view, or scan the whole grid and re-baseline it to each suite’s fastest framework. The sections below have the full per-operation charts in milliseconds.
| suite | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|
| js-framework | 1× | 4.1× | 3.6× | 1.7× | 2.7× | 1.7× | 1.2× |
| todomvc | 1× | 3.3× | 3.3× | 1.8× | 1.6× | 1.1× | 1.2× |
| weather-app | 1× | 1.3× | 1.5× | 1.3× | 1.1× | — | — |
| weather-app-lighthouse | 1× | 1.1× | 0.96× | 0.94× | 0.96× | — | — |
| chat-stream | 1× | 3.6× | 2.8× | 1.5× | 2.1× | 1.2× | 1.1× |
| svg-dashboard | 1× | 1.2× | — | 1.4× | 1.1× | — | — |
| js-framework-reorder | 1× | 2.9× | 6.0× | 1.5× | 2.2× | 1.5× | 2.2× |
| dbmon | 1× | 1.8× | 1.9× | 2.8× | 1.2× | 1.2× | 1.1× |
| effectful-list | 1× | 0.72× | 3.6× | 0.59× | 0.74× | 1.0× | 0.82× |
| memo-wall | 1× | 3.7× | 16× | 0.95× | 2.9× | 5.9× | 0.85× |
| recursive-context | 1× | 1.5× | 1.3× | 1.0× | 2.1× | 1.2× | 1.1× |
| spa-navigation | 1× | 0.79× | — | 0.86× | — | — | 1.2× |
| signal-favoring | 1× | 3.0× | 3.0× | 0.55× | 0.77× | 0.21× | 0.30× |
| portal-swarm | 1× | 2.2× | 6.1× | 1.0× | 2.5× | 2.7× | 1.1× |
| async-waterfall | 1× | 11× | 8.7× | 0.91× | 0.92× | 0.89× | — |
| news | 1× | 3.0× | 2.0× | 1.9× | 1.0× | 1.7× | 1.3× |
| streaming-ssr | 1× | 0.81× | 1.2× | 3.1× | — | 0.68× | — |
| bundle-size | 1× | 3.1× | 0.41× | 0.71× | 0.96× | 0.73× | 1.3× |
| ssr-throughput | 1× | 2.4× | 2.3× | 1.6× | 0.98× | 1.4× | 0.86× |
| geomean | 1× | 2.1× | 2.6× | 1.2× | 1.4× | 1.2× | 1.0× |
Each cell is that framework’s score relative to Octane (1×), geometric mean across the suite’s operations. Green is faster, red is slower.
Octane vs the field
Octane compiled from .tsrx and .tsx, against React 19 with the official React Compiler, Preact 10, Solid, Svelte 5, Ripple and Vue Vapor — each framework’s fixture written the way its docs recommend. React Compiler is enabled for every primary React comparison; memo-wall also includes a clearly labeled uncompiled React control. The ranked chips on each card are that suite’s one-line reading: every framework’s geometric mean across the card’s operations, relative to Octane, fastest first.
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 8 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|
| run | 2.4 | 2.9 | 5.8 | 7.6 | 2.1 | 3.8 | 2.4 | 2.7 |
| replace | 5.1 | 5.3 | 10 | 13 | 5.2 | 7.1 | 5.0 | 5.2 |
| add | 2.0 | 2.1 | 4.5 | 6.5 | 1.7 | 3.2 | 1.9 | 2.0 |
| update | 0.34 | 0.46 | 0.82 | 1.3 | 0.98 | 0.66 | 0.32 | 0.42 |
| select | 0.18 | 0.38 | 0.62 | 0.82 | 0.54 | 1.1 | 0.62 | 0.24 |
| swap | 0.42 | 0.74 | 4.5 | 0.66 | 0.52 | 0.60 | 0.50 | 0.50 |
| remove | 0.22 | 0.26 | 0.62 | 0.50 | 0.16 | 0.48 | 0.22 | 0.22 |
| runlots | 15 | 16 | 115 | 52 | 14 | 24 | 14 | 16 |
| select_lots | 0.06 | 0.88 | 2.1 | 2.4 | 2.2 | 4.5 | 3.6 | 0.12 |
| clear | 21 | 21 | 39 | 31 | 22 | 25 | 23 | 21 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 8 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|
| add 100 | 1.5 | 13 | 11 | 2.3 | 3.3 | 2.3 | 2.0 |
| toggle all on | 0.34 | 0.40 | 0.46 | 1.1 | 0.44 | 0.34 | 0.32 |
| toggle all off | 0.26 | 0.44 | 0.46 | 1.0 | 0.42 | 0.34 | 0.36 |
| complete 25 | 0.82 | 5.9 | 5.8 | 1.1 | 1.2 | 0.94 | 0.78 |
| filter cycle | 0.86 | 1.2 | 1.3 | 1.00 | 1.1 | 0.64 | 1.1 |
| edit 10 | 1.9 | 5.3 | 5.3 | 1.8 | 2.9 | 1.2 | 1.5 |
| clear completed | 0.24 | 0.42 | 0.48 | 0.34 | 0.28 | 0.20 | 0.38 |
| destroy 25 | 0.36 | 5.7 | 5.1 | 0.92 | 1.2 | 0.72 | 0.78 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 8 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Vue 3.6 |
|---|---|---|---|---|---|---|
| cold ready | 24 | 33 | 22 | 23 | 24 | 26 |
| forecast churn | 3.2 | 5.1 | 8.8 | 7.9 | 3.9 | 4.3 |
| search city | 1.5 | 1.6 | 2.0 | 2.4 | 1.7 | 1.8 |
| search error | 0.43 | 0.79 | 0.72 | 0.36 | 0.40 | 0.48 |
| search recover | 1.2 | 1.3 | 1.3 | 1.3 | 1.2 | 1.4 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 5 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Vue 3.6 |
|---|---|---|---|---|---|---|
| simulated FCP | 323 | 363 | 285 | 283 | 284 | 323 |
| observed FCP | 66 | 85 | 74 | 81 | 77 | 78 |
| simulated LCP | 365 | 404 | 326 | 329 | 370 | 370 |
| observed LCP | 93 | 102 | 95 | 81 | 84 | 94 |
| speed index | 323 | 363 | 285 | 283 | 284 | 323 |
| TBT | 0 | 0 | 0 | 0 | 0 | 0 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 8 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|
| fine stream | 1.3 | 6.8 | 4.3 | 2.8 | 3.0 | 1.2 | 1.2 |
| coarse stream | 0.68 | 2.2 | 1.5 | 1.1 | 1.3 | 0.76 | 0.68 |
| append history | 0.72 | 7.8 | 5.1 | 1.4 | 2.6 | 1.6 | 1.1 |
| switch conversation | 4.2 | 5.0 | 4.0 | 4.9 | 9.7 | 4.2 | 4.1 |
| type 160 chars | 1.1 | 3.0 | 4.2 | 1.1 | 1.5 | 1.2 | 1.2 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 20 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Solid 2.0 beta | Svelte 5 |
|---|---|---|---|---|
| mount | 2.8 | 3.7 | 5.9 | 3.8 |
| chart tick | 2.8 | 4.0 | 3.7 | 3.4 |
| sparse tick | 0.79 | 2.0 | 2.1 | 2.1 |
| drag nodes | 6.7 | 3.6 | 5.6 | 3.3 |
| pan and zoom | 1.7 | 4.9 | 1.0 | 2.4 |
| toggle selection | 1.8 | 1.1 | 3.3 | 1.8 |
| topology churn | 1.8 | 1.6 | 3.8 | 2.0 |
| label churn | 1.6 | 1.7 | 1.3 | 1.3 |
| tooltip swarm | 1.4 | 3.1 | 1.5 | 1.9 |
| icon swap | 2.1 | 2.4 | 3.6 | 2.7 |
| series toggle | 2.2 | 2.7 | 3.0 | 2.5 |
| style/spread pulse | 2.7 | 1.3 | 5.8 | 2.0 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 8 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|
| reverse | 0.95 | 1.1 | 2.0 | 2.4 | 1.0 | 14 | 0.96 | 1.2 |
| shuffle | 1.1 | 1.3 | 1.7 | 2.2 | 1.2 | 1.6 | 1.2 | 1.4 |
| rotatef | 0.05 | 0.13 | 1.3 | 0.12 | 0.08 | 0.11 | 0.09 | 0.58 |
| rotateb | 0.04 | 0.12 | 0.11 | 0.12 | 0.07 | 0.08 | 0.08 | 0.13 |
| prepend100 | 0.36 | 0.38 | 0.90 | 1.1 | 0.22 | 0.58 | — | 0.32 |
| append100 | 0.32 | 0.38 | 0.64 | 1.0 | 0.26 | 0.58 | 0.36 | 0.36 |
| insertmid100 | 0.28 | 0.42 | 0.78 | 1.1 | 0.28 | 0.60 | — | 0.36 |
| removefirst | 0.02 | 0.08 | 0.13 | 0.17 | 0.06 | 0.10 | 0.06 | 0.03 |
| removeevery10 | 0.09 | 0.14 | 0.25 | 0.25 | 0.16 | 0.14 | 0.10 | 0.21 |
| displace3 | 0.06 | 0.14 | 0.14 | 1.3 | 0.13 | 0.12 | 0.10 | 0.19 |
| displace4 | 0.07 | 0.14 | 0.14 | 1.3 | 0.13 | 0.11 | 0.11 | 0.20 |
| displace5 | 0.08 | 0.14 | 0.15 | 1.3 | 0.14 | 0.12 | 0.11 | 0.20 |
| displace6 | 0.06 | 0.14 | 0.15 | 1.3 | 0.14 | 0.12 | 0.11 | 0.20 |
| displace8 | 0.08 | 0.15 | 0.16 | 1.2 | 0.14 | 0.12 | 0.12 | 0.20 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 30 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|
| mount | 4.1 | 5.0 | 6.7 | 6.5 | 15 | 5.2 | 6.1 | 5.0 |
| tick | 1.4 | 1.6 | 2.2 | 3.2 | 9.3 | 2.0 | 2.0 | 1.6 |
| tick_partial | 0.45 | 0.55 | 1.2 | 2.0 | 1.4 | 0.61 | 0.59 | 0.53 |
| remount | 4.1 | 4.4 | 7.3 | 6.9 | 12 | 4.5 | 4.4 | 4.0 |
| sort | 2.1 | 2.3 | 4.0 | 4.4 | 3.0 | 2.5 | 2.1 | 2.2 |
| unmount | 1.8 | 1.6 | 2.3 | 1.7 | 2.8 | 1.7 | 1.6 | 1.7 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 30 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|
| mount_1k | 8.3 | 8.9 | 10 | 12 | 9.9 | 9.4 | 9.3 | 11 |
| update_nodeps | 0.14 | 0.26 | 0.00 | 7.2 | 0.00 | 0.01 | 0.08 | 0.00 |
| update_deps | 2.1 | 2.3 | 2.7 | 7.5 | 2.7 | 2.3 | 2.4 | 2.6 |
| clear | 0.91 | 0.94 | 1.4 | 0.97 | 1.5 | 1.1 | 1.2 | 1.8 |
| remount | 8.8 | 9.2 | 11 | 14 | 11 | 10 | 11 | 13 |
| remove_100_scattered | 0.36 | 0.52 | 0.70 | 1.9 | 0.84 | 0.40 | 0.44 | 1.0 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 20 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | React 19 (uncompiled control) | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|---|
| mount | 11 | 15 | 12 | 11 | 15 | 11 | 11 | 10 | 14 |
| parent_rerender_equal_A | 0.00 | 0.00 | 0.00 | 0.15 | 0.16 | 0.00 | 0.01 | 0.05 | 0.00 |
| parent_rerender_equal_B | 0.00 | 0.18 | 0.00 | 0.18 | 0.19 | 0.00 | 0.01 | 0.05 | 0.00 |
| one_change_A | 0.00 | 0.04 | 0.16 | 0.17 | 0.17 | 0.03 | 0.05 | 0.07 | 0.02 |
| one_change_B | 0.16 | 0.25 | 0.21 | 0.20 | 0.20 | 0.02 | 0.05 | 0.07 | 0.02 |
| ctx_through_wall_A | 0.32 | 0.57 | 0.77 | 0.91 | 1.0 | 0.29 | 0.36 | 0.34 | 0.22 |
| ctx_through_wall_B | 0.33 | 0.71 | 0.76 | 0.91 | 1.0 | 0.29 | 0.37 | 0.33 | 0.22 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 20 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|
| mount | 5.0 | 11 | 5.3 | 3.6 | 4.6 | 14 | 5.1 | 10 |
| update_root | 0.73 | 3.3 | 0.68 | 1.1 | 0.55 | 0.45 | 0.56 | 0.37 |
| update_partial | 0.03 | 0.16 | 0.07 | 0.11 | 0.04 | 0.04 | 0.05 | 0.01 |
| partial_unmount | 0.02 | 0.04 | 0.05 | 0.01 | 0.01 | 0.09 | 0.03 | 0 |
| partial_remount | 0.07 | 0.20 | 0.09 | 0.14 | 0.16 | 0.38 | 0.18 | 0.15 |
| unmount | 0.46 | 2.2 | 0.73 | 0.48 | 0.46 | 0.76 | 0.34 | 0.68 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 20 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|
| mount | 2.3 | 2.4 | 2.9 | 1.2 | 1.7 | 1.7 | 1.8 | 1.7 |
| bump_shallow | 0.01 | 0.01 | 0.00 | 0.05 | 0.00 | 0.00 | 0.00 | 0.00 |
| bump_middle | 0.00 | 0.00 | 0.02 | 0.03 | 0.00 | 0.00 | 0.00 | 0.00 |
| bump_deep | 0.00 | 0.00 | 0.04 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 |
| bump_sweep | 0.03 | 0.04 | 0.16 | 0.23 | 0.02 | 0.02 | 0.01 | 0.01 |
| bump_sweep_batched | 0.02 | 0.02 | 0.06 | 0.05 | 0.01 | 0.01 | 0.00 | 0.00 |
| bump_sweep_reverse | 0.02 | 0.02 | 0.06 | 0.06 | 0.01 | 0.01 | 0.00 | 0.00 |
| unmount | 0.15 | 0.13 | 0.20 | 0.13 | 0.13 | 0.15 | 0.12 | 0.15 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 20 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|
| mount_closed | 3.3 | 4.0 | 3.0 | 4.2 | 4.2 | 2.3 | 4.1 |
| open_all | 1.4 | 1.4 | 3.3 | 1.2 | 2.8 | 3.4 | 2.1 |
| rerender_open_A | 0 | 0.01 | 0.49 | 0 | 0.01 | 0.03 | 0.00 |
| rerender_open_B | 0.00 | 0.01 | 0.49 | 0.00 | 0.02 | 0.03 | 0.00 |
| rerender_open_B_stable | 0.00 | 0.01 | 0.26 | 0.01 | 0.02 | 0.03 | 0 |
| open_close_cycle | 1.7 | 1.8 | 3.4 | 1.3 | 2.7 | 2.3 | 2.2 |
| open_close_distinct | 1.9 | 1.9 | 3.5 | 1.4 | 2.8 | 2.5 | 2.3 |
| dispatch_through_portal | 0.00 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 10 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 |
|---|---|---|---|---|---|---|
| init | 21 | 305 | 180 | 19 | 19 | 19 |
| update | 20 | 184 | 180 | 19 | 19 | 18 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 20 iterations)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|---|
| SSR render | 0.02 | 0.03 | 0.08 | 0.07 | 0.05 | 0.02 | 0.05 | 0.02 |
| hydrate | 1.4 | 1.9 | 2.5 | 1.3 | 1.8 | 1.4 | 1.2 | 1.6 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 30 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Ripple 0.3 |
|---|---|---|---|---|---|
| staggered shell | 0.31 | 0.44 | 0.58 | 2.4 | 0.35 |
| staggered complete | 51 | 51 | 51 | 51 | 51 |
| all-fast shell | 0.17 | 0.06 | 0.21 | 1.9 | 0.05 |
| all-fast complete | 1.8 | 1.5 | 1.5 | 2.0 | 1.1 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (production build bytes)
| operation | Octane (.tsrx) | Octane (.tsx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta | Vue 3.6 |
|---|---|---|---|---|---|---|---|---|---|
| rows total gzip | 18 kB | 35 kB | 62 kB | 10 kB | 14 kB | 18 kB | 13 kB | — | — |
| TodoMVC total gzip | 18 kB | — | 60 kB | 7 kB | 13 kB | 18 kB | 13 kB | 24 kB | — |
| chat total gzip | 19 kB | — | 61 kB | 7 kB | 14 kB | 19 kB | 13 kB | 25 kB | — |
| weather total gzip | 28 kB | — | 67 kB | 10 kB | 17 kB | 24 kB | — | — | 31 kB |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 10 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler | Preact 10 | Solid 2.0 beta | Svelte 5 | Ripple 0.3 | Vue Vapor 3.6 beta |
|---|---|---|---|---|---|---|---|
| news-50 | 0.04 | 0.10 | 0.09 | 0.07 | 0.04 | 0.05 | 0.04 |
| news-500 | 0.45 | 1.1 | 1.0 | 0.67 | 0.43 | 0.66 | 0.38 |
Head-to-head targets
Suites whose roster is a specific stack rather than the whole field: Octane against React on real HTTP servers, composed async trees and the same TanStack Start app, and the Octane Three renderer against React Three Fiber and hand-written Three.js. These cards stay out of the at-a-glance grid above, which aggregates only the full-roster suites.
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 10 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler |
|---|---|---|
| initial render | 109 | 318 |
| update | 107 | 160 |
geometric mean across all operations, × vs Octane (.tsrx) — lower is better
Data table (score ms, 10 iterations)
| operation | Octane (.tsrx) | React 19 + Compiler |
|---|---|---|
| import renderer | 1.3 | 8.6 |
| cold spawn→listen | 32 | 39 |
| cold listen→first byte | 4.5 | 5.1 |
| cold spawn→first byte | 37 | 44 |
| staggered shell | 1.1 | 1.3 |
| staggered complete | 52 | 52 |
| all-fast shell | 0.28 | 0.25 |
| all-fast complete | 1.7 | 1.7 |
geometric mean across all operations, × vs Octane Start (minimal server) — lower is better
Data table (score ms, 7 iterations)
| operation | Octane Start (minimal server) | Octane Start (nitro) | React (TanStack Start) |
|---|---|---|---|
| cold spawn→listen | 40 | 50 | 61 |
| cold listen→first byte | 15 | 23 | 15 |
| cold spawn→first byte | 55 | 73 | 76 |
| warm TTFB /posts | 1.3 | 1.4 | 0.78 |
| warm total /posts | 1.3 | 1.4 | 0.80 |
| warm TTFB /deferred | 2.9 | 2.9 | 2.8 |
| warm total /deferred | 86 | 85 | 84 |
| deferred stream tail | 83 | 82 | 81 |
| sequential home requests | 0.87 | 0.85 | 0.62 |
geometric mean across all operations, × vs Octane Three — lower is better
Data table (score ms, 20 iterations)
| operation | Octane Three | React Three Fiber 9 | Plain Three.js |
|---|---|---|---|
| mount 1k | 2.2 | 2.7 | 1.2 |
| update 1k | 0.43 | 0.46 | 0.01 |
| reorder 1k | 1.2 | 1.9 | 0.46 |
| unmount 1k | 0.79 | 2.7 | 0.31 |
| reconstruct + dispose 1k | 1.3 | 1.6 | 1.1 |
| reconstruct component + dispose 1k | 1.4 | 1.5 | 1.1 |
| frame, 1k subscribers | 0.03 | 0.03 | 0.03 |
| raycast event | 0.16 | 0.32 | 0.08 |
geometric mean across all operations, × vs Octane Three — lower is better
Data table (production build bytes)
| operation | Octane Three | React Three Fiber 9 | Plain Three.js |
|---|---|---|---|
| minimal scene | 272 kB | 184 kB | 38 kB |
| full helpers | 272 kB | 244 kB | 186 kB |
Octane on Lynx
The dual-thread Lynx renderer on the same cross-framework table app as ReactLynx and both Vue Lynx renderers, measured two ways: wall clock on the Lynx-for-Web host with one shared page driver, and the deterministic wire cost of each commit — command counts against the changed-rows floor, exact and machine-independent, gated in CI. The gap between the wire bars is a KNOWN GAP the lynx-table ratio guards track; fixes tighten the guards and close the bars.
geometric mean across all operations, × vs Octane on Lynx — lower is better
Data table (score ms, 3 iterations)
| operation | Octane on Lynx | ReactLynx 0.122 | Vue Lynx vdom 3.6 beta | Vue Lynx vapor 3.6 beta |
|---|---|---|---|---|
| create 10k rows | 4368 | 1826 | 2245 | 2342 |
| update every 10th | 925 | 270 | 196 | 166 |
| select one row | 752 | 160 | 149 | 148 |
| update storm ×50 | 3288 | 6259 | 3324 | 1501 |
| select storm ×30 | 941 | 2579 | 1642 | 147 |
geometric mean across all operations, × vs Octane on Lynx — lower is better
Data table (deterministic counts)
| operation | Octane on Lynx | Changed-rows floor |
|---|---|---|
| create 10k rows | 160,000 | 160,000 |
| update every 10th | 1,000 | 1,000 |
| select one row | 2 | 2 |
| update storm ×50 | 50,000 | 50,000 |
| select storm ×30 | 60 | 60 |
The authoring cliff
Octane against itself: what naively-authored code costs relative to the compiled fast path. The de-opt fixtures render the same apps through plain createElement — the shape every binding produces — so the cliff is a first-class, regression-guarded number.
geometric mean across all operations, × vs Tuned .tsrx — lower is better
Data table (score ms, 8 iterations)
| operation | Tuned .tsrx | Naive .tsrx (React-style) | Naive .tsx | Plain .ts createElement |
|---|---|---|---|---|
| run | 2.6 | 3.9 | 4.3 | 5.7 |
| replace | 4.9 | 5.9 | 6.3 | 9.5 |
| add | 1.9 | 3.1 | 3.6 | 8.7 |
| update | 0.38 | 1.3 | 1.5 | 6.2 |
| select | 0.20 | 1.5 | 1.6 | 7.0 |
| swap | 0.46 | 1.5 | 1.7 | 8.3 |
| remove | 0.22 | 0.90 | 1.1 | 4.2 |
| runlots | 15 | 22 | 24 | 37 |
| select_lots | 0.12 | 6.3 | 8.5 | 39 |
| clear | 21 | 21 | 23 | 36 |
geometric mean across all operations, × vs Compiled .tsrx — lower is better
Data table (score ms, 30 iterations)
| operation | Compiled .tsrx | Plain .ts createElement |
|---|---|---|
| mount | 4.0 | 6.8 |
| tick | 1.4 | 5.1 |
| tick_partial | 0.44 | 4.0 |
| remount | 4.0 | 6.5 |
| sort | 2.0 | 6.4 |
| unmount | 1.6 | 1.8 |
Data table (score ms, 10 iterations)
| operation | Octane SSR |
|---|---|
| waterfall depth 1 | 0.04 |
| waterfall depth 2 | 0.05 |
| waterfall depth 4 | 0.07 |
| depth 4 × 32 wide | 2.3 |
| escape-heavy page | 3.2 |
| de-opt page (fast) | 0.96 |
| de-opt page (de-opted) | 2.3 |