so what Select = point update. Default Vapor for interaction-heavy lists; one-shots often sit on the frame floor.
verify selectStorm@10k 984→119 ms · vs RL ~22× · BG ~9.8×
IFR × VDOM/Vapor × ReactLynx on one scale. Conclusions up top (easy to digest); tables and charts below for verification. Median latency; (n.nn) = slowdown vs the row’s best. Generated 2026-07-28 · git 346eccf · 4× Intel(R) Xeon(R) Processor @ 2.80GHz.
Title = takeaway; so what = how to use; verify = numbers. Never ratio ms across environments.
so what Select = point update. Default Vapor for interaction-heavy lists; one-shots often sit on the frame floor.
verify selectStorm@10k 984→119 ms · vs RL ~22× · BG ~9.8×
so what Snapshot bulk-instantiate. Creation ≠ update.
verify create@10k RL 1659 · VDOM 1736 · Vapor 1732 ms
so what Same-density probe: RL wins. Vue first-frame → vdom +b +ifr.
verify FCP@10k RL 241 · +b +ifr 373 · vdom baseline 452 ms
so what “−19%” isn’t a constant. vdom +ifr (no +b) loses at scale; default vdom +b +ifr.
verify vs off: 1k -21% · 10k +33%
so what Template clone helps post-mount too. +ifr (no +b) ≈ baseline.
verify selectStorm@10k baseline 984 · +ifr 995 · +b +ifr 968 ms
so what Keeper sparse A2 helps ×1 on this host; ×4 is not a hedge. Native ET remains the big lever.
verify dense 152.9 → sparse 121.8 ms · ×4 +12%
so what Select=point, Update=batch. Product choice collapses to this line.
verify See tables below; never divide ms across instruments.
so what Medians move 2×+ across hosts. Same-host ratios only.
verify Ex: older host React selectStorm@10k ≈2544 ms; this host ≈2632 ms.
Black-box: real clicks → composed-DOM end state. Single-host full sweep (all four-axis permutations + ReactLynx × 1k/10k/30k in one run; per-key newest single-host samples win). Select = point update (selection / a few classes per tick); Update = batch update (many rows touched each pass). ReactLynx (memo) = Snapshot + IFR (always on) + manual memo/useCallback.
| scenario | vdom (baseline) | vdom +b | vdom +ifr | vdom +b +ifr | vapor (baseline) | vapor +b (default) | vapor +b! (bundle delivery) | vapor +b:c (code staging) | vapor +ifr | vapor +b +ifr (default +ifr) | rl (Snapshot+IFR+memo) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| create · 1k rows | 202.3 ms(1.13) | 201.9 ms(1.13) | 199.7 ms(1.12) | 217.0 ms(1.21) | 190.8 ms(1.07) | 213.5 ms(1.19) | 201.2 ms(1.12) | 196.8 ms(1.10) | 210.3 ms(1.18) | 201.9 ms(1.13) | 178.9 ms(1.00) |
| update storm ×50 · 1k | 127.4 ms(2.06) | 126.1 ms(2.04) | 124.6 ms(2.02) | 132.6 ms(2.15) | 66.5 ms(1.08) | 67.4 ms(1.09) | 66.4 ms(1.08) | 61.7 ms(1.00) | 68.3 ms(1.11) | 68.8 ms(1.12) | 579.0 ms(9.38) |
| select storm ×30 · 1k | 70.9 ms(5.37) | 64.6 ms(4.89) | 67.5 ms(5.12) | 65.1 ms(4.94) | 19.5 ms(1.48) | 20.5 ms(1.56) | 20.1 ms(1.52) | 13.2 ms(1.00) | 13.8 ms(1.05) | 19.2 ms(1.45) | 225.5 ms(17.08) |
| create · 10k rows | 1.74 s(1.09) | 1.60 s(1.00) | 1.66 s(1.04) | 1.68 s(1.05) | 1.65 s(1.03) | 1.73 s(1.08) | 1.77 s(1.11) | 1.76 s(1.10) | 1.65 s(1.03) | 1.73 s(1.08) | 1.66 s(1.04) |
| update every 10th · 10k | 114.8 ms(1.31) | 115.4 ms(1.32) | 117.1 ms(1.34) | 117.2 ms(1.34) | 91.6 ms(1.05) | 88.8 ms(1.02) | 87.4 ms(1.00) | 95.1 ms(1.09) | 89.6 ms(1.03) | 95.3 ms(1.09) | 265.3 ms(3.04) |
| select row · 10k | 79.5 ms(1.64) | 77.7 ms(1.61) | 81.7 ms(1.69) | 81.1 ms(1.68) | 57.8 ms(1.20) | 66.7 ms(1.38) | 72.9 ms(1.51) | 57.7 ms(1.19) | 48.4 ms(1.00) | 56.9 ms(1.18) | 155.2 ms(3.21) |
| update storm ×50 · 10k | 1.86 s(2.66) | 1.94 s(2.78) | 1.97 s(2.82) | 1.89 s(2.71) | 729.8 ms(1.04) | 887.6 ms(1.27) | 918.2 ms(1.31) | 759.7 ms(1.09) | 699.6 ms(1.00) | 740.5 ms(1.06) | 6.04 s(8.64) |
| select storm ×30 · 10k | 984.1 ms(10.59) | 1.04 s(11.19) | 994.6 ms(10.70) | 967.9 ms(10.41) | 106.0 ms(1.14) | 118.6 ms(1.28) | 106.8 ms(1.15) | 115.7 ms(1.24) | 92.9 ms(1.00) | 124.7 ms(1.34) | 2.63 s(28.32) |
| create · 30k rows | 5.28 s(1.13) | 4.85 s(1.04) | 4.83 s(1.04) | 5.40 s(1.16) | 5.13 s(1.10) | 5.36 s(1.15) | 5.05 s(1.08) | 5.04 s(1.08) | 5.13 s(1.10) | 5.18 s(1.11) | 4.66 s(1.00) |
| update storm ×50 · 30k | 10.9 s(1.79) | 7.21 s(1.18) | 7.34 s(1.20) | 7.51 s(1.23) | 6.74 s(1.10) | 7.22 s(1.18) | 6.11 s(1.00) | 7.29 s(1.19) | 6.33 s(1.03) | 7.07 s(1.16) | 21.2 s(3.46) |
| select storm ×30 · 30k | 3.57 s(12.97) | 3.23 s(11.73) | 3.33 s(12.10) | 3.17 s(11.53) | 306.1 ms(1.11) | 275.2 ms(1.00) | 332.6 ms(1.21) | 309.7 ms(1.13) | 322.3 ms(1.17) | 362.9 ms(1.32) | 10.3 s(37.29) |
| slowdown geometric mean | 2.48 | 2.32 | 2.35 | 2.38 | 1.12 | 1.19 | 1.18 | 1.11 | 1.06 | 1.18 | 5.02 |
Linear axes, zero baseline — absolute gaps, not log-compressed shape. Select charts = point updates; Update charts = batch throughput.
Point updates: wall time for 30 sequential selects — each tick touches selection state only. The vapor family stays flat; ReactLynx climbs; vdom +b +ifr pulls vdom down.
Batch updates: wall time for 50 multi-row update passes. Creation is separate — sustained batch throughput only.
ReactLynx still leads creation. vdom +b +ifr slightly helps create via template clone.
On a linear axis the Vapor family is pinned to the floor; a log axis separates all three orders of magnitude.
Vapor variants only, own y-scale — resolves baseline / +b / +ifr / +b +ifr from each other (V4 notation).
Same card density (~1k→30k els): every four-axis permutation + ReactLynx Snapshot+IFR, one single-host sweep (sfc-probe scale ladder). This is the first-frame scale — not comparable to storm ms above. Table below: CPU ×1; every cell covers 1k→30k (×4 covers through 10k).
| scale | vdom (baseline) | vdom +b | vdom +ifr | vdom +b +ifr | vapor (baseline) | vapor +b (default) | vapor +b! (bundle delivery) | vapor +b:c (code staging) | vapor +ifr | vapor +b +ifr (default +ifr) | vapor +b +ifr:c | rl |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1k elements | 128.3 ms(1.73) | 114.3 ms(1.54) | 101.6 ms(1.37) | 98.1 ms(1.33) | 160.6 ms(2.17) | 173.6 ms(2.35) | 163.6 ms(2.21) | 168.8 ms(2.28) | 152.9 ms(2.07) | 144.8 ms(1.96) | 157.2 ms(2.12) | 74.0 ms(1.00) |
| 3k elements | 204.9 ms(1.86) | 212.5 ms(1.93) | 177.4 ms(1.61) | 160.8 ms(1.46) | 255.2 ms(2.32) | 268.8 ms(2.45) | 312.5 ms(2.84) | 290.5 ms(2.64) | 235.7 ms(2.14) | 232.8 ms(2.12) | 260.4 ms(2.37) | 109.9 ms(1.00) |
| 5k elements | 258.5 ms(1.70) | 258.4 ms(1.70) | 252.1 ms(1.65) | 221.0 ms(1.45) | 378.7 ms(2.48) | 379.5 ms(2.49) | 388.3 ms(2.55) | 411.8 ms(2.70) | 345.1 ms(2.26) | 345.6 ms(2.27) | 347.0 ms(2.28) | 152.4 ms(1.00) |
| 10k elements | 452.1 ms(1.87) | 472.8 ms(1.96) | 601.6 ms(2.49) | 372.8 ms(1.54) | 644.0 ms(2.67) | 626.4 ms(2.60) | 727.8 ms(3.02) | 712.6 ms(2.95) | 583.1 ms(2.42) | 576.7 ms(2.39) | 624.2 ms(2.59) | 241.3 ms(1.00) |
| 20k elements | 839.0 ms(1.83) | 829.1 ms(1.81) | 1.05 s(2.29) | 708.2 ms(1.55) | 1.21 s(2.65) | 1.15 s(2.52) | 1.26 s(2.76) | 1.33 s(2.90) | 1.11 s(2.42) | 1.06 s(2.30) | 1.16 s(2.52) | 458.0 ms(1.00) |
| 30k elements | 1.17 s(1.67) | 1.21 s(1.72) | 1.51 s(2.16) | 1.59 s(2.26) | 1.80 s(2.56) | 1.73 s(2.47) | 1.78 s(2.53) | 2.02 s(2.88) | 1.54 s(2.19) | 1.66 s(2.36) | 1.60 s(2.28) | 702.2 ms(1.00) |
CPU ×4 (same matrix; ladder clipped to 10k — full ×4 coverage only through 10k).
| scale | vdom (baseline) | vdom +b | vdom +ifr | vdom +b +ifr | vapor (baseline) | vapor +b (default) | vapor +b! (bundle delivery) | vapor +b:c (code staging) | vapor +ifr | vapor +b +ifr (default +ifr) | vapor +b +ifr:c | rl |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1k elements | 582.3 ms(1.26) | 510.6 ms(1.10) | 649.4 ms(1.41) | 516.3 ms(1.12) | 503.4 ms(1.09) | 498.2 ms(1.08) | 547.3 ms(1.18) | 501.6 ms(1.09) | 596.0 ms(1.29) | 564.4 ms(1.22) | 530.6 ms(1.15) | 462.2 ms(1.00) |
| 3k elements | 1.22 s(1.60) | 1.01 s(1.32) | 1.13 s(1.47) | 926.8 ms(1.21) | 923.9 ms(1.20) | 837.9 ms(1.09) | 973.9 ms(1.27) | 944.6 ms(1.23) | 1.07 s(1.40) | 1.04 s(1.36) | 1.14 s(1.49) | 766.9 ms(1.00) |
| 5k elements | 1.62 s(1.39) | 1.42 s(1.22) | 1.51 s(1.30) | 1.33 s(1.15) | 1.42 s(1.22) | 1.26 s(1.08) | 1.27 s(1.09) | 1.35 s(1.16) | 1.55 s(1.33) | 1.49 s(1.28) | 1.58 s(1.35) | 1.17 s(1.00) |
| 10k elements | 2.90 s(1.47) | 2.47 s(1.25) | 3.24 s(1.64) | 2.36 s(1.20) | 2.52 s(1.27) | 2.42 s(1.22) | 2.29 s(1.16) | 2.32 s(1.18) | 2.63 s(1.33) | 2.56 s(1.29) | 2.76 s(1.39) | 1.98 s(1.00) |
ReactLynx lowest throughout. Among Vue: vdom +ifr (no +b) crosses above vdom baseline by 10k; vdom +b +ifr is the scale hedge.
Ladder clipped to 10k (full ×4 coverage). Slow CPU amplifies MT parse cost.
Same-source sfc-probe (~1004 els): only enableSparseNaming flips. Native ET still stub; sparse still builds the full native tree. See ifr-bench/GRAPH-ENG-MATRIX.md.
| scenario | naming | web gzip | FCP ×1 | Δ | FCP ×4 | Δ |
|---|---|---|---|---|---|---|
vapor +ifr vapor-ifr-dense | dense | 89,720 | 152.9 ms | +0.0% | 596.0 ms | +0.0% |
vapor +b +ifr (alias) vapor-ifr-sparse | sparse | 90,007 | 121.8 ms | -20.3% | 670.2 ms | +12.4% |
vapor +b +ifr (default +ifr) vapor-ifr | sparse | 90,007 | 144.8 ms | -5.3% | 564.4 ms | -5.3% |
Unified table app (real clicks, dual-thread), every legal optimization combination (cell name = baseline × +b[:t|c|e] × +ifr[:c|e], see the legend below; a factor = per-flag marginal Δ%), each measured for create / update10th / updateStorm / select / selectStorm (1k/10k, reps=2 — read ±10% as noise). Factors = single-axis marginal Δ%. Engine cells are recorded as N/A on this host (Lynx for Web has no engine ET PAPI) and filtered out of the tables by default (toggle at the top reveals them); their interpretation-fallback control samples remain in the results JSON. See ifr-bench/GRAPH-ENG-REPORT.md §3.3.
| flag | meaning |
|---|---|
baseline | per-node addressing — plainest and safest: every node named independently, no metadata, no validation. vdom = op stream; vapor = named tree. |
+b | block templates: use the template block's parts information for block naming (base+offset) and template materialization. The staging parameter defaults to the render model's natural rung — vdom +b ≡ +b:c (code: baked create()); vapor +b ≡ +b:d (data: the serialized tree crosses the thread boundary as data at RUNTIME — REGISTER_TREE once per template — interpreted on the MT; forced by the Split topology). The two +b factors are therefore not comparable across render models. The information source differs too: intrinsic for vdom (declared by Vue's Block), recovered for vapor (compile-time analysis, hence the fingerprint fail-safe). |
+b:c | vapor staging raised to the code rung (#337): the plugin parses each template() HTML string at build time, bakes a straight-line-PAPI create() into the MT bundle, and instantiation crosses as a single INSTANTIATE_TEMPLATE(id) — the residual never crosses at runtime. Naming keeps the base+offset preorder, the update path is untouched; a build↔runtime structure-fingerprint mismatch silently falls back to the REGISTER_TREE data path. |
+b! | the Delivery column flipped alone (#338): staging stays data, but the serialized tree is baked into the MT bundle at BUILD time (registerVaporStructure(hash, ast)); the BG sends only the fingerprint hash (REGISTER_TREE_BUNDLE) — zero structure bytes cross. Interpretation, naming, and the update path are byte-identical to vapor +b; on hash mismatch it silently falls back to the full REGISTER_TREE. |
+b:e | staging raised to the engine rung: templates live in the engine (__CreateElementTemplate family), native clone. Applies to the persistent tree. N/A on this host (Lynx for Web has no such PAPI). |
| delivery | (sixth property column) when the residual reaches the MT: runtime = shipped over the wire (vapor +b's data today, and native); bundle = compiled into the MT bundle at build (vdom's code, RL Snapshot, vapor's +b! and +b:c). +b! is the one cell that flips Delivery with every other column held fixed — the pure single-column delivery read. |
+ifr | IFR: the MTS paints an ephemeral first-frame copy; on BG boot, hydration adopts it or replays in full. The paint parameter defaults to inheriting the persistent tree's staging. |
+ifr:e | ONLY the first-frame copy is painted at the engine rung (legacy name engine-et); the persistent tree is unchanged. Distinct from +b:e (whole lifetime). N/A on this host. |
+ifr:c | ONLY the first-frame copy is painted at the code rung (#340): the ephemeral frame runs a Code-Template create() executor compiled at RUNTIME on the MT, while the persistent tree stays data/block (legacy name disposable-et). Distinct from +b:c (whole lifetime, baked at build). Unlike +ifr:e this is measured on this host (no longer N/A) — see the +ifr:c paint effect row and its takeaway card. |
Data files keep legacy keys (mapping: vdom-et=vdom +b, vapor=vapor +b (default), vapor-dense=vapor baseline, vapor-bang=vapor +b!, vapor-code=vapor +b:c, vapor-ifr-dense=vapor +ifr, vapor-engine=+b:e, vapor-ifr-engine-et=+ifr:e, vapor-ifr-code-paint=+ifr:c). vapor-ifr-sparse is a same-coordinate replicate of vapor +b +ifr, omitted from display (data retained in JSON). Mechanism terms (Named Tree / Tree-Template / Code-Template / Engine-Template) and the five-axis coordinates live in GRAPH-ENG-REPORT.md.
| scenario @1k | coordinate | create | update10th | updateStorm | select | selectStorm |
|---|---|---|---|---|---|---|
vdom vdom | ops/node/random-access/BTS/persistent/— | 202.3 ms | 24.7 ms | 127.4 ms | 26.6 ms | 70.9 ms |
vdom +b vdom-et | code/block/random-access/BTS/persistent/bundle | 201.9 ms | 24.8 ms | 126.1 ms | 26.1 ms | 64.6 ms |
vdom +ifr vdom-ifr | ops/node/random-access/BTS+MTS/persistent+ephemeral/— | 199.7 ms | 23.2 ms | 124.6 ms | 26.5 ms | 67.5 ms |
vdom +b +ifr vdom-ifr-et | code/block/random-access/BTS+MTS/persistent+ephemeral/bundle | 217.0 ms | 26.9 ms | 132.6 ms | 26.0 ms | 65.1 ms |
vapor vapor-dense | data/node/traversal/BTS/persistent/runtime | 190.8 ms | 26.3 ms | 66.5 ms | 27.0 ms | 19.5 ms |
vapor +b vapor | data/block/traversal+recover/BTS/persistent/runtime | 213.5 ms | 26.9 ms | 67.4 ms | 27.0 ms | 20.5 ms |
vapor +b! vapor-bang | data/block/traversal+recover/BTS/persistent/bundle | 201.2 ms | 24.5 ms | 66.4 ms | 26.1 ms | 20.1 ms |
vapor +b:c vapor-code | code/block/traversal+recover/BTS/persistent/bundle | 196.8 ms | 25.5 ms | 61.7 ms | 27.1 ms | 13.2 ms |
vapor +ifr vapor-ifr-dense | data/node/traversal/BTS+MTS/persistent+ephemeral/runtime | 210.3 ms | 21.3 ms | 68.3 ms | 25.8 ms | 13.8 ms |
vapor +b +ifr vapor-ifr | data/block/traversal+recover/BTS+MTS/persistent+ephemeral/runtime | 201.9 ms | 27.0 ms | 68.8 ms | 17.0 ms | 19.2 ms |
| scenario @10k | coordinate | create | update10th | updateStorm | select | selectStorm |
|---|---|---|---|---|---|---|
vdom vdom | ops/node/random-access/BTS/persistent/— | 1.74 s | 114.8 ms | 1.86 s | 79.5 ms | 984.1 ms |
vdom +b vdom-et | code/block/random-access/BTS/persistent/bundle | 1.60 s | 115.4 ms | 1.94 s | 77.7 ms | 1.04 s |
vdom +ifr vdom-ifr | ops/node/random-access/BTS+MTS/persistent+ephemeral/— | 1.66 s | 117.1 ms | 1.97 s | 81.7 ms | 994.6 ms |
vdom +b +ifr vdom-ifr-et | code/block/random-access/BTS+MTS/persistent+ephemeral/bundle | 1.68 s | 117.2 ms | 1.89 s | 81.1 ms | 967.9 ms |
vapor vapor-dense | data/node/traversal/BTS/persistent/runtime | 1.65 s | 91.6 ms | 729.8 ms | 57.8 ms | 106.0 ms |
vapor +b vapor | data/block/traversal+recover/BTS/persistent/runtime | 1.73 s | 88.8 ms | 887.6 ms | 66.7 ms | 118.6 ms |
vapor +b! vapor-bang | data/block/traversal+recover/BTS/persistent/bundle | 1.77 s | 87.4 ms | 918.2 ms | 72.9 ms | 106.8 ms |
vapor +b:c vapor-code | code/block/traversal+recover/BTS/persistent/bundle | 1.76 s | 95.1 ms | 759.7 ms | 57.7 ms | 115.7 ms |
vapor +ifr vapor-ifr-dense | data/node/traversal/BTS+MTS/persistent+ephemeral/runtime | 1.65 s | 89.6 ms | 699.6 ms | 48.4 ms | 92.9 ms |
vapor +b +ifr vapor-ifr | data/block/traversal+recover/BTS+MTS/persistent+ephemeral/runtime | 1.73 s | 95.3 ms | 740.5 ms | 56.9 ms | 124.7 ms |
| scenario @30k | coordinate | create | update10th | updateStorm | select | selectStorm |
|---|---|---|---|---|---|---|
vdom vdom | ops/node/random-access/BTS/persistent/— | 5.28 s | 478.3 ms | 10.9 s | 308.4 ms | 3.57 s |
vdom +b vdom-et | code/block/random-access/BTS/persistent/bundle | 4.85 s | 355.9 ms | 7.21 s | 248.6 ms | 3.23 s |
vdom +ifr vdom-ifr | ops/node/random-access/BTS+MTS/persistent+ephemeral/— | 4.83 s | 370.0 ms | 7.34 s | 306.8 ms | 3.33 s |
vdom +b +ifr vdom-ifr-et | code/block/random-access/BTS+MTS/persistent+ephemeral/bundle | 5.40 s | 369.9 ms | 7.51 s | 242.3 ms | 3.17 s |
vapor vapor-dense | data/node/traversal/BTS/persistent/runtime | 5.13 s | 253.8 ms | 6.74 s | 268.7 ms | 306.1 ms |
vapor +b vapor | data/block/traversal+recover/BTS/persistent/runtime | 5.36 s | 266.2 ms | 7.22 s | 236.8 ms | 275.2 ms |
vapor +b! vapor-bang | data/block/traversal+recover/BTS/persistent/bundle | 5.05 s | 250.4 ms | 6.11 s | 275.4 ms | 332.6 ms |
vapor +b:c vapor-code | code/block/traversal+recover/BTS/persistent/bundle | 5.04 s | 257.2 ms | 7.29 s | 291.3 ms | 309.7 ms |
vapor +ifr vapor-ifr-dense | data/node/traversal/BTS+MTS/persistent+ephemeral/runtime | 5.13 s | 242.9 ms | 6.33 s | 272.1 ms | 322.3 ms |
vapor +b +ifr vapor-ifr | data/block/traversal+recover/BTS+MTS/persistent+ephemeral/runtime | 5.18 s | 250.6 ms | 7.07 s | 288.9 ms | 362.9 ms |
Main effects (one flag flipped at a time). Each flag co-moves several coordinate axes (see the “flag ↔ coordinate axis” map below), so these numbers attribute to flag granularity and cannot be split finer. Charts: bars left (negative) = the flag makes that op faster; read ±10% as noise (reps=2). Engine factors are stub probe overhead on web.
+b factor rows (vdom and vapor) sit inside the ±10% noise band on update10th / select / updateStorm / selectStorm at every scale — corroborating the ops-level factorial (identical update frames + native calls in every cell). Templates change who builds the first frame, not how holes are written.__VUE_LYNX_ENGINE_ET_STATUS__ = stub). Their interpretation-fallback control samples serve only as a fail-safe-cost / noise yardstick, never as engine conclusions; the axis runs end-to-end and reports real numbers the day the engine PAPI ships.create() executor (durable tree stays data/block) moves content-probe FCP vs plain vapor +b +ifr by ×1 -3.3%…+11.9%, ×4 -6%…+9.5%, mean +5.2% — see the +ifr:c paint effect row. The mechanism matches the +b:c storms verdict: a single ephemeral instantiation is dominated by PAPI element creation (identical in both paints); the code rung only removes the per-node interpreter walk, a small fraction of first-frame cost. Unlike +ifr:e this is a real measurement — the Code-Template executor runs on web.| flag | staging | naming | access | thread | lifetime | origin | axes moved |
|---|---|---|---|---|---|---|---|
| render | ops→data | · | random-access→traversal | · | · | —→runtime | 3 |
| +b (vdom) | ops→code | node→block | · | · | · | —→bundle | 3 |
| +b (vapor) | · | node→block | traversal→traversal+recover | · | · | · | 2 |
| +ifr | · | · | · | BTS→BTS+MTS | persistent→persistent+ephemeral | · | 2 |
| +b:e (N/A on web) | data→native | · | · | BTS→Engine | · | · | 2 |
| +ifr:e (N/A on web) | · | · | · | · | · | runtime→runtime(native-paint) | 1 |
Each row is one cell→cell move; the lit columns are the axes that flag co-moves, diffed straight from the 6-slot coord string (not invented). Because these axes are collinear — +ifr always moves thread and lifetime together, render moves 3 at once — the Δ% in the factor tables attributes only to flag granularity and cannot be split into per-axis numbers. The native/engine axes are N/A on this host (a fail-safe-cost yardstick only).
| factor (marginal Δ%) @1k | create | update10th | updateStorm | select | selectStorm |
|---|---|---|---|---|---|
| render effect (vdom → vapor, baselines) | -5.7% | +6.5% | -47.8% | +1.5% | -72.5% |
| +b effect (vdom, no ifr) | -0.2% | +0.4% | -1% | -1.9% | -8.9% |
| +b effect (vdom, with +ifr) | +8.7% | +15.9% | +6.4% | -1.9% | -3.6% |
| +b effect (vapor, no ifr) | +11.9% | +2.3% | +1.4% | +0% | +5.1% |
| +b effect (vapor, with +ifr) | -4% | +26.8% | +0.7% | -34.1% | +39.1% |
| +b! delivery effect (vapor) | -5.8% | -8.9% | -1.5% | -3.3% | -2% |
| +b:d→c effect (vapor) | -7.8% | -5.2% | -8.5% | +0.4% | -35.6% |
| +ifr effect (vdom) | -1.3% | -6.1% | -2.2% | -0.4% | -4.8% |
| +ifr effect (vapor +b) | -5.4% | +0.4% | +2.1% | -37% | -6.3% |
| factor (marginal Δ%) @10k | create | update10th | updateStorm | select | selectStorm |
|---|---|---|---|---|---|
| render effect (vdom → vapor, baselines) | -5.2% | -20.2% | -60.7% | -27.3% | -89.2% |
| +b effect (vdom, no ifr) | -7.9% | +0.5% | +4.5% | -2.3% | +5.7% |
| +b effect (vdom, with +ifr) | +1.3% | +0.1% | -3.9% | -0.7% | -2.7% |
| +b effect (vapor, no ifr) | +5.3% | -3.1% | +21.6% | +15.4% | +11.9% |
| +b effect (vapor, with +ifr) | +4.5% | +6.4% | +5.8% | +17.6% | +34.2% |
| +b! delivery effect (vapor) | +2.1% | -1.6% | +3.4% | +9.3% | -9.9% |
| +b:d→c effect (vapor) | +1.5% | +7.1% | -14.4% | -13.5% | -2.4% |
| +ifr effect (vdom) | -4.3% | +2% | +6.1% | +2.8% | +1.1% |
| +ifr effect (vapor +b) | -0.3% | +7.3% | -16.6% | -14.7% | +5.1% |
| factor (marginal Δ%) @30k | create | update10th | updateStorm | select | selectStorm |
|---|---|---|---|---|---|
| render effect (vdom → vapor, baselines) | -2.8% | -46.9% | -38.4% | -12.9% | -91.4% |
| +b effect (vdom, no ifr) | -8.1% | -25.6% | -34.1% | -19.4% | -9.6% |
| +b effect (vdom, with +ifr) | +11.7% | +0% | +2.4% | -21% | -4.7% |
| +b effect (vapor, no ifr) | +4.5% | +4.9% | +7.2% | -11.9% | -10.1% |
| +b effect (vapor, with +ifr) | +0.9% | +3.2% | +11.8% | +6.2% | +12.6% |
| +b! delivery effect (vapor) | -5.8% | -5.9% | -15.3% | +16.3% | +20.9% |
| +b:d→c effect (vapor) | -6% | -3.4% | +1% | +23% | +12.5% |
| +ifr effect (vdom) | -8.4% | -22.6% | -32.9% | -0.5% | -6.7% |
| +ifr effect (vapor +b) | -3.4% | -5.9% | -2.1% | +22% | +31.9% |
FCP main effects (content-probe first-frame scale — a different instrument from the storm ms above; do not ratio across):
| factor (FCP Δ%) | ×1 @1k | ×1 @3k | ×1 @5k | ×1 @10k | ×1 @20k | ×1 @30k | ×4 @1k | ×4 @3k | ×4 @5k | ×4 @10k |
|---|---|---|---|---|---|---|---|---|---|---|
| render effect (vdom → vapor, baselines) | +25.2% | +24.5% | +46.5% | +42.4% | +44.5% | +53.8% | -13.5% | -24.5% | -12.1% | -13.2% |
| +b effect (vdom, no ifr) | -10.9% | +3.7% | 0% | +4.6% | -1.2% | +3% | -12.3% | -17.1% | -12.1% | -15% |
| +b effect (vdom, with +ifr) | -3.4% | -9.4% | -12.3% | -38% | -32.6% | +4.9% | -20.5% | -17.9% | -11.8% | -27.1% |
| +b effect (vapor, no ifr) | +8.1% | +5.3% | +0.2% | -2.7% | -4.9% | -3.7% | -1% | -9.3% | -11.4% | -4.1% |
| +b effect (vapor, with +ifr) | -5.3% | -1.2% | +0.1% | -1.1% | -4.8% | +7.5% | -5.3% | -2.3% | -3.6% | -2.6% |
| +b! delivery effect (vapor) | -5.8% | +16.3% | +2.3% | +16.2% | +9.6% | +2.3% | +9.9% | +16.2% | +0.7% | -5.2% |
| +b:d→c effect (vapor) | -2.8% | +8.1% | +8.5% | +13.8% | +15.1% | +16.6% | +0.7% | +12.7% | +7.3% | -3.8% |
| +b:d→e effect (vapor, N/A) | -14.6% | -13.2% | -16.6% | -12.8% | -13.3% | -13.4% | +22.6% | +44.4% | +33.7% | +23.2% |
| +ifr effect (vdom) | -20.8% | -13.4% | -2.5% | +33.1% | +25.2% | +29.4% | +11.5% | -7.7% | -6.4% | +11.7% |
| +ifr effect (vapor +b) | -16.6% | -13.4% | -8.9% | -7.9% | -8.4% | -4.5% | +13.3% | +24.7% | +18.5% | +6% |
| +ifr:e paint effect (N/A) | -9.1% | -13.2% | -19.7% | -14.3% | -14.1% | -22.5% | +16.2% | +26.4% | +28.6% | +33.1% |
| +ifr:c paint effect | +8.6% | +11.9% | +0.4% | +8.2% | +9.6% | -3.3% | -6% | +9.5% | +5.7% | +7.7% |
What each architecture has been measured for in the unified schema.
| architecture | table storms | content-probe FCP | instrumented BG/e2e |
|---|---|---|---|
vdom (baseline) vdom | ✓ | ✓ | ✓ |
vdom +ifr vdom-ifr | ✓ | ✓ | — |
vdom +b +ifr vdom-ifr-et | ✓ | ✓ | — |
vapor +b (default) vapor | ✓ | ✓ | ✓ |
vapor +b +ifr (default +ifr) vapor-ifr | ✓ | ✓ | — |
vapor +ifr vapor-ifr-dense | ✓ | ✓ | — |
vdom +b vdom-et | ✓ | ✓ | — |
vapor (baseline) vapor-dense | ✓ | ✓ | — |
vapor +b:c (code staging) vapor-code | ✓ | ✓ | — |
vapor +b! (bundle delivery) vapor-bang | ✓ | ✓ | — |
vapor +b +ifr:c vapor-ifr-code-paint | — | ✓ | — |
rl (Snapshot+IFR+memo) react | ✓ | ✓ | — |
ReactLynx (naive) react-naive | ✓ | — | — |
ReactLynx (compiler) react-compiler | ✓ | — | — |
pnpm --filter vue-lynx-benchmark bench:unified && bench:synthesize && bench:report