JavaScript Signals Benchmark

Eighteen scenarios, three runtimes, one runner per comparison. Where Quant wins, where it loses, and why each of those is the expected result of how it is built.

Results

The suite is this project's own; lower is better. Node 22.23.4, 9 rounds; each ratio measured within one runner; Reflex bf71877, alien-signals 3.2.1. Earlier snapshots: REPORT.md (Q6), HISTORY.md.

Time of Reflex and alien-signals relative to Reflex Quant, per scenarioQuant is fixed at 1×. Points to the right are slower than Quant. Geometric means: Reflex 1.01×, alien-signals 2.20×.← faster than Quantslower than Quant →reorder.rotate-256: Quant 1×, Reflex 0.83×, alien-signals 6.67× (time relative to Quant)reorder.rotate-2566.67×reorder.reverse-8: Quant 1×, Reflex 0.83×, alien-signals 5.88× (time relative to Quant)reorder.reverse-85.88×long-reorder.256: Quant 1×, Reflex 0.83×, alien-signals 5.88× (time relative to Quant)long-reorder.2565.88×edit.insert-one-256: Quant 1×, Reflex 0.94×, alien-signals 4.76× (time relative to Quant)edit.insert-one-2564.76×shared-chaotic.64x32: Quant 1×, Reflex 1.28×, alien-signals 4.55× (time relative to Quant)shared-chaotic.64x324.55×value-sort.256x32: Quant 1×, Reflex 0.70×, alien-signals 3.33× (time relative to Quant)value-sort.256x323.33×fan-in.1024: Quant 1×, Reflex 1.01×, alien-signals 2.63× (time relative to Quant)fan-in.10242.63×batch.writes-32: Quant 1×, Reflex 1.82×, alien-signals 2.22× (time relative to Quant)batch.writes-322.22×branch.switch-100: Quant 1×, Reflex 1.15×, alien-signals 2.13× (time relative to Quant)branch.switch-1002.13×stable.wide-256: Quant 1×, Reflex 0.85×, alien-signals 2.13× (time relative to Quant)stable.wide-2562.13×stable.wide-8: Quant 1×, Reflex 0.85×, alien-signals 1.72× (time relative to Quant)stable.wide-81.72×diamond.8x8: Quant 1×, Reflex 1.08×, alien-signals 1.33× (time relative to Quant)diamond.8x81.33×replace-half.256: Quant 1×, Reflex 1.10×, alien-signals 1.30× (time relative to Quant)replace-half.2561.30×fan-out.computeds-1000: Quant 1×, Reflex 0.85×, alien-signals 1.16× (time relative to Quant)fan-out.computeds-10001.16×fan-out.effects-1000: Quant 1×, Reflex 1.19×, alien-signals 1.14× (time relative to Quant)fan-out.effects-10001.14×static.chain-100: Quant 1×, Reflex 0.92×, alien-signals 1.08× (time relative to Quant)static.chain-1001.08×lifecycle.mount-100: Quant 1×, Reflex 1.52×, alien-signals 0.96× (time relative to Quant)lifecycle.mount-100alien 0.96×static.read-clean: Quant 1×, Reflex 0.91×, alien-signals 0.82× (time relative to Quant)static.read-cleanalien wins: turns out the fastest graph is no graph at all :)0.5×1×2×4×8×
Time relative to Reflex Quant (Quant = 1×, log scale, lower is faster). Sorted by alien-signals: the more the scenario looks like a graph, with reorders, fan-in and shared nodes, the further it falls behind. Labels show alien-signals. CI run 42794143933, Node 22.23.4, 9 rounds; each ratio measured within one runner.
Table view
ScenarioQuantReflexalien-signals
reorder.rotate-2561.000.836.67
reorder.reverse-81.000.835.88
long-reorder.2561.000.835.88
edit.insert-one-2561.000.944.76
shared-chaotic.64x321.001.284.55
value-sort.256x321.000.703.33
fan-in.10241.001.012.63
batch.writes-321.001.822.22
branch.switch-1001.001.152.13
stable.wide-2561.000.852.13
stable.wide-81.000.851.72
diamond.8x81.001.081.33
replace-half.2561.001.101.30
fan-out.computeds-10001.000.851.16
fan-out.effects-10001.001.191.14
static.chain-1001.000.921.08
lifecycle.mount-1001.001.520.96
static.read-clean1.000.910.82
Geometric mean1.001.012.20

Where Quant is ahead

Where it is behind

Against alien-signals alone the reorder scenarios are the widest gap in Quant's favour, at 0.15 to 0.17 of its time. That one is structural, and the counters on the dependency tracking page show it without a clock.

Method

What these numbers are not

The suite is this project's own, chosen to cover its task list. It is not a general ranking of signals libraries, and the numbers move between runs: an earlier run had Quant within 25 % of the better rival on all 18 scenarios with a geometric mean of 0.97; the one shown here has 17 of 18 and 1.03. The trajectory over every CI run is in HISTORY.md.

Benchmarks also reward skipped work. A runtime can win a scenario by not doing something its users rely on. Quant's timings count only for a build that passes its differential tests, so speed is measured against fixed semantics. In this project a benchmark may choose between two correct implementations. It may not change what correct means.

Evidence