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.

frameworks
suite
all suites
suiteOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
js-framework4.1×3.6×1.7×2.7×1.7×1.2×
todomvc3.3×3.3×1.8×1.6×1.1×1.2×
weather-app1.3×1.5×1.3×1.1×
weather-app-lighthouse1.1×0.96×0.94×0.96×
chat-stream3.6×2.8×1.5×2.1×1.2×1.1×
svg-dashboard1.2×1.4×1.1×
js-framework-reorder2.9×6.0×1.5×2.2×1.5×2.2×
dbmon1.8×1.9×2.8×1.2×1.2×1.1×
effectful-list0.72×3.6×0.59×0.74×1.0×0.82×
memo-wall3.7×16×0.95×2.9×5.9×0.85×
recursive-context1.5×1.3×1.0×2.1×1.2×1.1×
spa-navigation0.79×0.86×1.2×
signal-favoring3.0×3.0×0.55×0.77×0.21×0.30×
portal-swarm2.2×6.1×1.0×2.5×2.7×1.1×
async-waterfall11×8.7×0.91×0.92×0.89×
news3.0×2.0×1.9×1.0×1.7×1.3×
streaming-ssr0.81×1.2×3.1×0.68×
bundle-size3.1×0.41×0.71×0.96×0.73×1.3×
ssr-throughput2.4×2.3×1.6×0.98×1.4×0.86×
geomean2.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.

FasterSlowerOctane = 1× baseline

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.

js-frameworkkrausest-style table operations over 1,000 rows — create, replace, partial update, select, swap, remove, clear.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 8 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
run2.42.95.87.62.13.82.42.7
replace5.15.310135.27.15.05.2
add2.02.14.56.51.73.21.92.0
update0.340.460.821.30.980.660.320.42
select0.180.380.620.820.541.10.620.24
swap0.420.744.50.660.520.600.500.50
remove0.220.260.620.500.160.480.220.22
runlots15161155214241416
select_lots0.060.882.12.42.24.53.60.12
clear2121393122252321
todomvcTodoMVC workflows — add, complete, filter, edit, clear and destroy items, with native form/input events in the loop.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 8 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
add 1001.513112.33.32.32.0
toggle all on0.340.400.461.10.440.340.32
toggle all off0.260.440.461.00.420.340.36
complete 250.825.95.81.11.20.940.78
filter cycle0.861.21.31.001.10.641.1
edit 101.95.35.31.82.91.21.5
clear completed0.240.420.480.340.280.200.38
destroy 250.365.75.10.921.20.720.78
weather-appA real weather dashboard — cold start to interactive, keyed forecast churn, and async city search with error and recovery flows. The DOM-census counters in the baseline are diagnostics and stay out of the chart.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 8 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Vue 3.6
cold ready243322232426
forecast churn3.25.18.87.93.94.3
search city1.51.62.02.41.71.8
search error0.430.790.720.360.400.48
search recover1.21.31.31.31.21.4
weather-app — LighthouseDesktop Lighthouse lab metrics for the same weather app — simulated and observed first and largest contentful paint, speed index, and total blocking time. Simulated paints use Lighthouse’s desktop-network model; observed paints come from the unthrottled browser trace. Cumulative layout shift is unitless and omitted from the millisecond chart.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 5 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Vue 3.6
simulated FCP323363285283284323
observed FCP668574817778
simulated LCP365404326329370370
observed LCP9310295818494
speed index323363285283284323
TBT000000
chat-streamChat UI workloads — token streaming, coarse updates, history append, conversation switches and text input.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 8 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
fine stream1.36.84.32.83.01.21.2
coarse stream0.682.21.51.11.30.760.68
append history0.727.85.11.42.61.61.1
switch conversation4.25.04.04.99.74.24.1
type 160 chars1.13.04.21.11.51.21.2
svg-dashboardA hand-rolled SVG observability dashboard — path and transform churn, keyed reconciliation inside SVG, foreignObject labels, portal tooltips, runtime icons, and style/spread updates.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 20 iterations)
operationOctane (.tsrx)React 19 + CompilerSolid 2.0 betaSvelte 5
mount2.83.75.93.8
chart tick2.84.03.73.4
sparse tick0.792.02.12.1
drag nodes6.73.65.63.3
pan and zoom1.74.91.02.4
toggle selection1.81.13.31.8
topology churn1.81.63.82.0
label churn1.61.71.31.3
tooltip swarm1.43.11.51.9
icon swap2.12.43.62.7
series toggle2.22.73.02.5
style/spread pulse2.71.35.82.0
js-framework-reorderThe keyed-reorder matrix — reverse, shuffle, rotations, prepends and displacements — stressing the keyed reconciler. Ripple’s prepend and insert-mid cells are omitted because their current identity gates fail; invalid timings are never charted.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 8 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
reverse0.951.12.02.41.0140.961.2
shuffle1.11.31.72.21.21.61.21.4
rotatef0.050.131.30.120.080.110.090.58
rotateb0.040.120.110.120.070.080.080.13
prepend1000.360.380.901.10.220.580.32
append1000.320.380.641.00.260.580.360.36
insertmid1000.280.420.781.10.280.600.36
removefirst0.020.080.130.170.060.100.060.03
removeevery100.090.140.250.250.160.140.100.21
displace30.060.140.141.30.130.120.100.19
displace40.070.140.141.30.130.110.110.20
displace50.080.140.151.30.140.120.110.20
displace60.060.140.151.30.140.120.110.20
displace80.080.150.161.20.140.120.120.20
dbmonThe DBMonster dashboard — high-frequency cell updates across a wall of database rows.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 30 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
mount4.15.06.76.5155.26.15.0
tick1.41.62.23.29.32.02.01.6
tick_partial0.450.551.22.01.40.610.590.53
remount4.14.47.36.9124.54.44.0
sort2.12.34.04.43.02.52.12.2
unmount1.81.62.31.72.81.71.61.7
effectful-listA 1,000-item list where every row runs effects and refs — the subsystems a plain row bench never touches.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 30 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
mount_1k8.38.910129.99.49.311
update_nodeps0.140.260.007.20.000.010.080.00
update_deps2.12.32.77.52.72.32.42.6
clear0.910.941.40.971.51.11.21.8
remount8.89.2111411101113
remove_100_scattered0.360.520.701.90.840.400.441.0
memo-wallMemo bail-out walls — parent re-renders against memoized subtrees, and context updates punching through them. The primary React entry uses React Compiler; an additional, explicitly uncompiled React control isolates the compiler’s effect. Solid, Svelte, Ripple and Vue Vapor have no parent re-render to absorb, so their near-zero wall ops are the fine-grained model’s honest number.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 20 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerReact 19 (uncompiled control)Preact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
mount111512111511111014
parent_rerender_equal_A0.000.000.000.150.160.000.010.050.00
parent_rerender_equal_B0.000.180.000.180.190.000.010.050.00
one_change_A0.000.040.160.170.170.030.050.070.02
one_change_B0.160.250.210.200.200.020.050.070.02
ctx_through_wall_A0.320.570.770.911.00.290.360.340.22
ctx_through_wall_B0.330.710.760.911.00.290.370.330.22
recursive-contextA deep recursive tree driven by context updates — mount, root and partial updates, unmount.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 20 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
mount5.0115.33.64.6145.110
update_root0.733.30.681.10.550.450.560.37
update_partial0.030.160.070.110.040.040.050.01
partial_unmount0.020.040.050.010.010.090.030
partial_remount0.070.200.090.140.160.380.180.15
unmount0.462.20.730.480.460.760.340.68
spa-navigationFull-page client navigation — routed-subtree teardown and mount while the app shell survives, including nested-layout reuse and a 6× CPU-throttled route swap.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 20 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerSolid 2.0 betaVue Vapor 3.6 beta
deep route swap2.47.71.51.82.6
deep → nested1.23.20.810.540.75
nested → deep1.54.11.31.82.6
nested route swap0.190.470.230.240.31
deep route swap (6× CPU)15469.91318
signal-favoringDeep-tree state bumps at increasing depths — the workload shape signal frameworks are built around.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 20 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
mount2.32.42.91.21.71.71.81.7
bump_shallow0.010.010.000.050.000.000.000.00
bump_middle0.000.000.020.030.000.000.000.00
bump_deep0.000.000.040.010.000.000.000.00
bump_sweep0.030.040.160.230.020.020.010.01
bump_sweep_batched0.020.020.060.050.010.010.000.00
bump_sweep_reverse0.020.020.060.060.010.010.000.00
unmount0.150.130.200.130.130.150.120.15
portal-swarmMany portals mounting, opening, closing and re-rendering — dispatching through portal boundaries.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 20 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
mount_closed3.34.03.04.24.22.34.1
open_all1.41.43.31.22.83.42.1
rerender_open_A00.010.4900.010.030.00
rerender_open_B0.000.010.490.000.020.030.00
rerender_open_B_stable0.000.010.260.010.020.030
open_close_cycle1.71.83.41.32.72.32.2
open_close_distinct1.91.93.51.42.82.52.3
dispatch_through_portal0.000.010.000.000.000.000.00
async-waterfallTen nested async levels with 16ms simulated latency — Octane’s compiled parallel-use path versus React and Preact nested-use waterfalls and signal-first models.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 10 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3
init21305180191919
update20184180191918
newsA news-site page: full SSR render and client hydration of the same app.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 20 iterations)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
SSR render0.020.030.080.070.050.020.050.02
hydrate1.41.92.51.31.81.41.21.6
streaming-ssrStreaming SSR shell and completion times for staggered Suspense and all-fast renders. Preact participates with its public stream renderer; Svelte 5 is omitted because its public server renderer is buffered.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 30 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaRipple 0.3
staggered shell0.310.440.582.40.35
staggered complete5151515151
all-fast shell0.170.060.211.90.05
all-fast complete1.81.51.52.01.1
bundle-sizeProduction shipped JavaScript bytes with normalized minification — total gzip across the rows, TodoMVC, chat and weather fixtures.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (production build bytes)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 betaVue 3.6
rows total gzip18 kB35 kB62 kB10 kB14 kB18 kB13 kB
TodoMVC total gzip18 kB60 kB7 kB13 kB18 kB13 kB24 kB
chat total gzip19 kB61 kB7 kB14 kB19 kB13 kB25 kB
weather total gzip28 kB67 kB10 kB17 kB24 kB31 kB
ssr-throughputServer renders of the news page at 50 and 500 items — benchmark score ms per render.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 10 iterations)
operationOctane (.tsrx)React 19 + CompilerPreact 10Solid 2.0 betaSvelte 5Ripple 0.3Vue Vapor 3.6 beta
news-500.040.100.090.070.040.050.04
news-5000.451.11.00.670.430.660.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.

async-compositionComposed async use() trees — Octane’s compiled parallel-use batching against React’s render-and-suspend loop. The wave, call and span counts in the baseline are deterministic diagnostics and stay out of the chart.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 10 iterations)
operationOctane (.tsrx)React 19 + Compiler
initial render109318
update107160
ssr-httpReal production HTTP servers rendering the news page — renderer import, cold spawn/listen/first-byte, and streamed shell and completion times over HTTP for staggered and all-fast Suspense.

geometric mean across all operations, × vs Octane (.tsrx) — lower is better

Data table (score ms, 10 iterations)
operationOctane (.tsrx)React 19 + Compiler
import renderer1.38.6
cold spawn→listen3239
cold listen→first byte4.55.1
cold spawn→first byte3744
staggered shell1.11.3
staggered complete5252
all-fast shell0.280.25
all-fast complete1.71.7
tanstack-startThe same TanStack Start app served by React and by the Octane port — cold start to first byte, warm TTFB and completion for the posts and deferred routes, the deferred stream tail, and sequential home requests.

geometric mean across all operations, × vs Octane Start (minimal server) — lower is better

Data table (score ms, 7 iterations)
operationOctane Start (minimal server)Octane Start (nitro)React (TanStack Start)
cold spawn→listen405061
cold listen→first byte152315
cold spawn→first byte557376
warm TTFB /posts1.31.40.78
warm total /posts1.31.40.80
warm TTFB /deferred2.92.92.8
warm total /deferred868584
deferred stream tail838281
sequential home requests0.870.850.62
three-rendererObject lifecycle at 1,000 meshes — mount, update, reorder, unmount, direct and component-driven reconstruction with disposal, a frame with 1,000 subscribers, and raycast events — for the Octane Three renderer, React Three Fiber, and hand-written Three.js.

geometric mean across all operations, × vs Octane Three — lower is better

Data table (score ms, 20 iterations)
operationOctane ThreeReact Three Fiber 9Plain Three.js
mount 1k2.22.71.2
update 1k0.430.460.01
reorder 1k1.21.90.46
unmount 1k0.792.70.31
reconstruct + dispose 1k1.31.61.1
reconstruct component + dispose 1k1.41.51.1
frame, 1k subscribers0.030.030.03
raycast event0.160.320.08
three-bundle-sizeShipped gzip JavaScript for a minimal scene and a helpers-heavy scene across the three renderers.

geometric mean across all operations, × vs Octane Three — lower is better

Data table (production build bytes)
operationOctane ThreeReact Three Fiber 9Plain Three.js
minimal scene272 kB184 kB38 kB
full helpers272 kB244 kB186 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.

lynx-table — Lynx for Web wall clockThe cross-framework table on the Lynx-for-Web host at 10,000 rows — Octane, ReactLynx, and both Vue Lynx renderers driven by the byte-identical page driver, medians over fresh-page reps. Host-bound milliseconds; the ratios are the portable claim.

geometric mean across all operations, × vs Octane on Lynx — lower is better

Data table (score ms, 3 iterations)
operationOctane on LynxReactLynx 0.122Vue Lynx vdom 3.6 betaVue Lynx vapor 3.6 beta
create 10k rows4368182622452342
update every 10th925270196166
select one row752160149148
update storm ×503288625933241501
select storm ×3094125791642147
lynx-table — commit wire costHost commands per operation crossing the background→main thread wire for the 10,000-row cross-framework table, against the changed-rows floor: the commands a change of that size strictly implies. The gap between the two bars is the tracked, CI-guarded optimization target.

geometric mean across all operations, × vs Octane on Lynx — lower is better

Data table (deterministic counts)
operationOctane on LynxChanged-rows floor
create 10k rows160,000160,000
update every 10th1,0001,000
select one row22
update storm ×5050,00050,000
select storm ×306060

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.

js-framework — the authoring cliffThe same 1,000-row app authored four ways: tuned .tsrx, React-style naive .tsrx and .tsx, and plain-.ts createElement with no compiler involvement (the shape every binding produces).

geometric mean across all operations, × vs Tuned .tsrx — lower is better

Data table (score ms, 8 iterations)
operationTuned .tsrxNaive .tsrx (React-style)Naive .tsxPlain .ts createElement
run2.63.94.35.7
replace4.95.96.39.5
add1.93.13.68.7
update0.381.31.56.2
select0.201.51.67.0
swap0.461.51.78.3
remove0.220.901.14.2
runlots15222437
select_lots0.126.38.539
clear21212336
dbmon — de-opt pathThe exact dbmon workload in plain-.ts createElement (full descriptor reconciliation) against the compiled fixture.

geometric mean across all operations, × vs Compiled .tsrx — lower is better

Data table (score ms, 30 iterations)
operationCompiled .tsrxPlain .ts createElement
mount4.06.8
tick1.45.1
tick_partial0.444.0
remount4.06.5
sort2.06.4
unmount1.61.8
SSR scenariosOctane-only SSR shapes — suspense waterfalls by depth, a 32-wide fan-out, an escape-heavy page, and the de-opt page pair. Benchmark score ms per render.
Data table (score ms, 10 iterations)
operationOctane SSR
waterfall depth 10.04
waterfall depth 20.05
waterfall depth 40.07
depth 4 × 32 wide2.3
escape-heavy page3.2
de-opt page (fast)0.96
de-opt page (de-opted)2.3