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. Signal-favoring uses Octane’s TSRX native signals at f2770fc1d8; the other suites measure main at 80d230b879. Both snapshots are from 21 October 2026. See the measurement notes for source revisions, environments, and reproduction commands. The signals refresh passed its semantic and work checks. The original full run breached 16 performance guards and failed two auxiliary diagnostics; its chart timing runs completed.

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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
js-framework1×7.0×6.5×2.9×4.3×0.84×0.90×2.5×
uibench1×3.1×5.9×15×—0.91×1.0×2.5×
todomvc1×3.2×3.5×1.4×1.9×0.84×1.0×1.6×
weather-app1×1.2×1.6×1.4×1.2×——1.3×
weather-app-lighthouse1×0.99×0.83×0.81×0.88×——0.83×
chat-stream1×2.1×2.3×1.5×2.2×0.68×0.68×0.98×
svg-dashboard1×1.0×—1.3×1.2×——0.79×
js-framework-reorder1×2.4×5.9×0.93×1.7×0.72×0.89×1.5×
dbmon1×1.8×2.1×2.6×1.1×0.96×0.93×0.86×
effectful-list1×1.3×7.4×0.95×1.2×0.73×1.1×1.8×
memo-wall1×2.4×14×0.84×2.4×0.34×0.67×—
recursive-context1×1.4×0.97×0.98×1.7×0.35×0.94×0.49×
spa-navigation1×1.2×—2.7×——2.2×0.86×
signal-favoring1×6.6×10×1.1×1.3×0.48×0.62×5.1×
portal-swarm1×0.82×4.5×0.56×1.2×0.28×0.63×1.0×
async-waterfall1×10×7.7×0.84×0.82×0.80×—0.79×
news1×2.0×1.3×1.0×0.68×0.70×1.1×0.76×
streaming-ssr1×0.88×0.89×1.4×—0.76×—1.2×
bundle-size1×1.8×0.24×0.48×0.49×0.48×0.68×0.31×
ssr-throughput1×3.0×2.7×1.5×0.99×1.4×1.0×1.9×
geomean1×2.1×2.8×1.3×1.3×0.65×0.91×1.2×

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, Vue Vapor and Inferno 9 — 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. Selection and swap scores are per-click averages of warmed batches.

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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
run3.33.78.0104.25.72.74.44.0
replace6.97.9151912116.28.58.8
add3.03.36.9122.94.92.64.43.6
update0.480.740.822.01.40.700.340.520.46
select0.010.100.100.180.080.160.000.000.04
swap0.020.142.70.170.050.120.020.010.12
remove0.440.620.900.680.360.380.320.200.44
runlots22271541062939253340
select_lots0.011.11.11.60.856.60.000.000.39
clear435092745148504651
UIbenchUIbench’s 96-case desktop matrix — table mutations, animation updates, keyed tree reorders and published worst cases. Every target must match semantic signatures and survivor identity before its timings are accepted.

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 RCRipple 0.4Vue Vapor 3.6 RCInferno 9
table/[100,4]/render0.470.390.501.20.380.530.26
table/[100,4]/removeAll0.070.150.070.280.040.070.03
table/[100,4]/sort/00.060.150.220.340.060.050.10
table/[100,4]/sort/10.060.140.200.340.060.040.09
table/[100,4]/filter/320.010.090.120.310.010.010.05
table/[100,4]/filter/160.020.090.110.300.010.010.04
table/[100,4]/filter/80.020.090.100.330.010.010.04
table/[100,4]/filter/40.020.090.100.340.020.020.05
table/[100,4]/activate/320.010.080.100.240.010.010.04
table/[100,4]/activate/160.010.080.110.210.010.010.04
table/[100,4]/activate/80.010.080.100.240.010.010.04
table/[100,4]/activate/40.010.080.110.270.010.010.04
table/[50,4]/render0.190.170.250.560.170.250.13
table/[50,4]/removeAll0.020.060.030.200.010.030.02
table/[50,4]/sort/00.030.070.090.160.030.030.04
table/[50,4]/sort/10.020.070.090.190.020.020.04
table/[50,4]/filter/320.010.040.050.140.010.000.02
table/[50,4]/filter/160.010.040.050.170.010.010.02
table/[50,4]/filter/80.010.050.050.160.010.010.02
table/[50,4]/filter/40.010.040.050.140.010.010.02
table/[50,4]/activate/320.010.040.050.130.010.000.02
table/[50,4]/activate/160.010.040.060.130.010.000.02
table/[50,4]/activate/80.010.040.060.120.010.000.02
table/[50,4]/activate/40.010.040.060.120.010.010.02
table/[100,2]/render0.270.240.310.780.290.380.17
table/[100,2]/removeAll0.030.090.040.270.030.080.02
table/[100,2]/sort/00.050.110.180.260.050.040.07
table/[100,2]/sort/10.050.100.170.270.050.040.06
table/[100,2]/filter/320.010.060.060.230.010.010.03
table/[100,2]/filter/160.020.060.070.230.010.010.03
table/[100,2]/filter/80.020.060.070.260.010.010.03
table/[100,2]/filter/40.020.060.070.260.020.020.03
table/[100,2]/activate/320.010.050.070.170.010.000.02
table/[100,2]/activate/160.010.050.070.160.010.000.02
table/[100,2]/activate/80.010.060.070.170.010.010.02
table/[100,2]/activate/40.020.060.080.190.010.010.02
table/[50,2]/render0.140.140.170.440.130.190.09
table/[50,2]/removeAll0.020.050.020.130.010.030.01
table/[50,2]/sort/00.030.050.070.140.020.020.03
table/[50,2]/sort/10.020.050.060.140.020.020.03
table/[50,2]/filter/320.010.030.030.110.000.000.01
table/[50,2]/filter/160.010.030.040.110.010.010.02
table/[50,2]/filter/80.010.040.040.130.010.010.02
table/[50,2]/filter/40.010.030.040.120.010.010.02
table/[50,2]/activate/320.000.030.030.090.000.000.01
table/[50,2]/activate/160.000.030.040.100.010.000.01
table/[50,2]/activate/80.010.030.040.090.000.000.01
table/[50,2]/activate/40.010.030.040.090.010.010.01
anim/100/320.000.020.020.040.010.010.01
anim/100/160.010.020.020.040.010.010.01
anim/100/80.010.020.020.050.010.010.01
anim/100/40.010.020.020.050.010.010.01
tree/[500]/render0.861.00.852.00.692.00.49
tree/[500]/removeAll0.130.360.200.610.120.350.11
tree/[50,10]/render0.920.870.942.00.732.20.57
tree/[50,10]/removeAll0.170.390.150.640.140.310.12
tree/[10,50]/render0.840.850.881.90.722.10.50
tree/[10,50]/removeAll0.130.240.120.690.140.280.07
tree/[5,100]/render0.870.700.831.90.651.90.58
tree/[5,100]/removeAll0.140.240.070.520.090.200.10
tree/[2,2,2,2,2,2,2,2,2,2]/render5.94.34.4113.9103.1
tree/[2,2,2,2,2,2,2,2,2,2]/removeAll1.93.11.76.71.73.01.9
tree/[500]/[reverse]0.240.481.20.950.240.270.29
tree/[500]/[insertFirst(1)]0.010.110.200.710.010.010.07
tree/[500]/[insertLast(1)]0.010.080.220.570.010.010.07
tree/[500]/[removeFirst(1)]0.010.090.210.670.010.010.07
tree/[500]/[removeLast(1)]0.010.070.250.590.010.010.07
tree/[500]/[moveFromEndToStart(1)]0.030.500.210.630.010.030.10
tree/[500]/[moveFromStartToEnd(1)]0.030.110.210.640.010.030.11
tree/[50,10]/[reverse]0.060.070.320.530.070.070.15
tree/[50,10]/[insertFirst(1)]0.010.010.240.500.010.010.15
tree/[50,10]/[insertLast(1)]0.000.010.240.480.010.010.09
tree/[50,10]/[removeFirst(1)]0.000.020.220.470.000.010.09
tree/[50,10]/[removeLast(1)]0.000.010.240.440.000.010.09
tree/[50,10]/[moveFromEndToStart(1)]0.010.070.240.440.010.010.09
tree/[50,10]/[moveFromStartToEnd(1)]0.010.020.230.500.000.010.08
tree/[10,50]/[reverse]0.040.040.260.500.040.040.12
tree/[10,50]/[insertFirst(1)]0.000.010.210.430.000.010.07
tree/[10,50]/[insertLast(1)]0.000.010.230.450.000.010.07
tree/[10,50]/[removeFirst(1)]0.010.030.200.460.010.010.06
tree/[10,50]/[removeLast(1)]0.010.020.190.430.010.010.06
tree/[10,50]/[moveFromEndToStart(1)]0.010.040.280.410.010.010.07
tree/[10,50]/[moveFromStartToEnd(1)]0.010.010.210.450.010.010.07
tree/[5,100]/[reverse]0.040.040.240.470.030.030.10
tree/[5,100]/[insertFirst(1)]0.000.010.210.430.000.010.07
tree/[5,100]/[insertLast(1)]0.000.010.220.430.000.010.07
tree/[5,100]/[removeFirst(1)]0.010.040.170.390.010.030.06
tree/[5,100]/[removeLast(1)]0.010.040.180.400.010.020.06
tree/[5,100]/[moveFromEndToStart(1)]0.010.030.240.450.010.010.08
tree/[5,100]/[moveFromStartToEnd(1)]0.010.010.230.440.010.010.08
tree/[500]/[kivi_worst_case]0.240.571.10.980.300.260.30
tree/[500]/[snabbdom_worst_case]0.030.100.210.730.020.030.12
tree/[500]/[react_worst_case]0.020.600.220.670.030.010.11
tree/[500]/[virtual_dom_worst_case]0.030.100.670.710.030.040.10
tree/[10,10,10,10]/no_change3.63.65.8294.6152.3
tree/[2,2,2,2,2,2,2,2,2,2]/no_change0.500.901.02.40.822.10.53
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
add 1001.29.8121.72.71.21.74.1
toggle all on0.220.320.320.780.520.220.420.20
toggle all off0.220.340.320.680.420.180.200.14
complete 250.623.75.20.700.980.420.381.3
filter cycle0.661.31.10.661.00.680.740.94
edit 100.883.34.31.02.50.580.741.4
clear completed0.160.320.260.120.220.160.140.30
destroy 250.483.54.20.561.10.320.421.5
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 RCSvelte 5Vue 3.6Inferno 9
cold ready42513837423928
forecast churn7.71020159.01116
search city3.83.66.54.55.14.93.7
search error0.961.51.60.810.950.991.8
search recover2.52.53.97.03.53.33.0
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 RCSvelte 5Vue 3.6Inferno 9
simulated FCP362366290290334329293
observed FCP60605247524754
simulated LCP412409333374379379341
observed LCP89837966706869
speed index362366290290334329293
TBT0000000
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
fine stream1.03.04.03.42.90.780.821.3
coarse stream0.520.880.780.660.920.380.280.44
append history0.604.13.91.22.10.480.541.4
switch conversation3.72.83.15.19.02.43.41.6
type 160 chars0.981.42.00.641.20.500.400.82
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 RCSvelte 5Inferno 9
mount5.76.59.46.54.6
chart tick4.25.24.94.94.8
sparse tick0.961.82.32.21.4
drag nodes4.83.74.84.03.3
pan and zoom1.54.71.64.12.0
toggle selection3.51.12.82.31.0
topology churn3.02.75.73.22.5
label churn1.92.11.51.81.6
tooltip swarm1.63.02.02.51.7
icon swap4.53.64.44.92.2
series toggle3.33.54.23.63.5
style/spread pulse3.81.67.02.51.4
js-framework-reorderThe keyed-reorder matrix — reverse, shuffle, rotations, prepends and displacements — stressing the keyed reconciler. Semantic output and surviving row identity are gated before timings are accepted.

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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
reverse1.31.73.05.11.2161.11.21.4
shuffle1.61.83.13.41.42.21.01.41.9
rotatef0.070.231.90.140.060.120.030.060.13
rotateb0.070.210.120.130.050.080.020.060.12
prepend1000.500.721.31.70.480.880.460.420.54
append1000.520.780.901.60.500.820.420.440.52
insertmid1000.540.801.41.90.540.880.500.580.66
removefirst0.030.140.130.150.060.100.020.020.06
removeevery100.220.280.320.320.250.260.180.220.25
displace30.070.220.121.70.060.080.060.070.12
displace40.100.270.162.40.080.110.080.100.19
displace50.130.320.223.30.100.160.110.130.25
displace60.150.300.233.80.120.160.110.130.21
displace80.140.380.242.50.130.180.130.120.27
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
mount8.1121314289.68.28.46.3
tick3.43.65.47.4214.04.43.13.0
tick_partial1.10.892.33.51.91.10.870.780.95
remount6.87.11414188.97.06.76.3
sort4.85.19.79.85.63.94.14.74.5
unmount2.53.34.54.86.62.32.22.62.0
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
mount_1k171818211716162217
update_nodeps0.010.550.01160.000.010.000.000.15
update_deps4.75.25.5154.84.94.65.14.7
clear1.51.52.02.61.81.91.92.61.3
remount171820232120172720
remove_100_scattered0.581.20.933.80.990.590.270.490.82
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RC
mount354833324429311644
parent_rerender_equal_A0.000.000.000.260.340.000.010.000.00
parent_rerender_equal_B0.000.000.000.300.340.000.010.000.00
one_change_A0.010.150.260.290.300.060.070.010.02
one_change_B0.200.300.250.290.290.040.070.010.02
ctx_through_wall_A0.962.81.52.44.00.591.90.400.52
ctx_through_wall_B0.561.20.871.41.90.390.720.280.40
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
mount1317117.111263.1212.9
update_root1.12.01.82.60.760.920.440.810.63
update_partial0.100.220.180.110.100.150.020.010.05
partial_unmount0.080.100.180.060.100.150.040.090.08
partial_remount0.270.450.180.210.260.550.050.460.07
unmount0.710.941.20.630.871.70.561.70.60
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 RCVue Vapor 3.6 RCInferno 9
deep route swap2.33.53.03.17.51.8
deep → nested0.911.11.30.872.20.75
nested → deep1.62.71.82.24.21.1
nested route swap0.140.210.170.130.240.11
deep route swap (6× CPU)152121214612
nodes_deep307830773077512351253077
elements_deep205220522052205220522052
text_deep102510251025102530731025
comments_deep1.000204600
signal-favoringDeep-tree counter updates using native reactive primitives. Octane uses its TSRX implementation with component-owned useSignal$ signals and direct text bindings; React and Preact use hooks.

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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
mount9.47.13.43.94.23.04.92.8
bump_shallow0.000.000.070.000.000.000.000.02
bump_middle0.000.020.040.000.000.000.000.01
bump_deep0.000.040.010.000.000.000.000.00
bump_sweep0.010.190.520.010.020.010.010.12
bump_sweep_batched0.010.050.080.010.010.000.000.11
bump_sweep_reverse0.010.050.100.010.010.000.000.11
unmount1.00.530.270.230.210.210.230.30
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
mount_closed7.56.45.58.37.03.46.12.5
open_all4.82.45.71.75.21.14.71.4
rerender_open_A0.010.010.720.010.0200.000.05
rerender_open_B0.010.010.730.010.010.000.000.06
rerender_open_B_stable0.010.010.260.010.020.000.010.05
open_close_cycle5.23.06.72.05.00.995.81.7
open_close_distinct5.52.96.72.35.41.36.61.8
dispatch_through_portal0.000.010.000.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 RCSvelte 5Ripple 0.4Inferno 9
init2330416419181817
update2016416317171617
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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
SSR render0.030.100.140.100.030.020.040.050.06
hydrate3.74.43.41.83.42.41.42.81.0
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 RCRipple 0.4Inferno 9
staggered shell0.160.180.130.350.110.12
staggered complete505050505052
all-fast shell0.110.060.080.190.060.07
all-fast complete0.991.11.11.10.984.3
bundle-sizeProduction shipped JavaScript bytes from Vite 8 builds with its default (Oxc) minifier, the same settings for every framework — total gzip across the rows, TodoMVC, chat and weather fixtures. The solid bar is what each fixture ships; the lighter extension is the same application once it uses the framework’s whole client API, so a framework that tree-shakes shows a range.

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

hatched: the same application using the framework’s whole client API

Data table (production build bytes)
operationOctane (.tsrx)Octane (.tsx)React 19 + CompilerPreact 10Solid 2.0 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCVue 3.6Inferno 9
rows total gzip28 kB52 kB61 kB10 kB16 kB15 kB14 kB——10 kB
TodoMVC total gzip33 kB—59 kB7 kB15 kB15 kB15 kB21 kB—9 kB
chat total gzip32 kB—60 kB7 kB16 kB16 kB15 kB23 kB—10 kB
weather total gzip44 kB—66 kB10 kB19 kB21 kB——30 kB12 kB
rows total gzip, whole client API167 kB168 kB—12 kB52 kB34 kB29 kB———
TodoMVC total gzip, whole client API167 kB——11 kB51 kB33 kB28 kB90 kB——
chat total gzip, whole client API168 kB——12 kB52 kB34 kB29 kB91 kB——
weather total gzip, whole client API173 kB——15 kB55 kB38 kB——94 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 RCSvelte 5Ripple 0.4Vue Vapor 3.6 RCInferno 9
news-500.030.100.090.050.030.040.030.06
news-5000.421.10.970.540.410.540.390.73

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 + CompilerInferno 9
initial render107307102
update103153101
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 + CompilerInferno 9
import renderer2.6131.7
cold spawn→listen344532
cold listen→first byte6.07.15.7
cold spawn→first byte405238
staggered shell0.440.560.44
staggered complete505053
all-fast shell0.450.290.39
all-fast complete1.41.44.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→listen444082
cold listen→first byte254023
cold spawn→first byte6980105
warm TTFB /posts1.61.20.94
warm total /posts1.61.20.96
warm TTFB /deferred1.91.91.6
warm total /deferred838281
deferred stream tail808080
sequential home requests0.960.810.68
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 1k3.13.61.5
update 1k0.560.690.02
reorder 1k1.62.40.37
unmount 1k0.962.20.27
reconstruct + dispose 1k1.92.61.0
reconstruct component + dispose 1k1.92.31.1
frame, 1k subscribers0.040.050.03
raycast event0.190.420.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 scene190 kB184 kB38 kB
full helpers250 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 rows523646650654
update every 10th1091388474
select one row3157389.5
update storm ×5037725821198316
select storm ×3087122067272
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 rows11
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
run5.4141610
replace12201813
add4.8171215
update1.25.24.57.5
select0.012.33.04.8
swap0.033.23.36.6
remove0.704.43.96.6
runlots33748469
select_lots0.01323068
clear89724958
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
mount7.114
tick2.68.7
tick_partial0.785.5
remount6.712
sort3.68.0
unmount2.22.4
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.06
waterfall depth 20.07
waterfall depth 40.09
depth 4 × 32 wide3.1
escape-heavy page4.0
de-opt page (fast)1.7
de-opt page (de-opted)4.3