You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -124,26 +124,26 @@ Benchmark (lands alongside in PR A): `flush-fanout-allocation-200x500` — 200 f
124
124
- Drop `boundRun`. `Reaction.create` calls `reaction.run()` directly.
125
125
- Extract shared `mergeContext(target, additional, defaults)` helper. Each class passes its own seed values (`{ value }` for Signal, `{ firstRun }` for Reaction, raw bag for Dependency).
126
126
127
-
Benchmark addition: `reaction-create-stop-200kx10` — page-render shape with many short-lived reactions. Expected: small but measurable improvement in `sub-unsub-100k`.
127
+
Benchmark: existing `sub-unsub-100k` measures this directly. Expected: small but measurable improvement. (Currently runs at 22ms on CI — near the noise floor; if the win is small the bench may need amplification to clear σ.)
128
128
129
129
### Item 7: Benchmark additions
130
130
131
-
These workloads aren't gating Items 1-6 (those land on correctness merits), but they baseline the perf claims and gate the larger Item 9 rewrite. Each follows the existing pattern in `bench-signal.js` — `performance.mark` + `performance.measure`, sink-anchored, iteration counts sized to clear the σ-floor.
131
+
These workloads aren't gating Items 1-6 (those land on correctness merits), but they baseline the perf claims and gate the larger Item 9 rewrite. Each follows the existing pattern in `bench-signal.js` — `performance.mark` + `performance.measure`, sink-anchored, iteration counts grounded in actual CI durations of existing benches to clear the σ-floor with headroom.
132
+
133
+
Ships as a precursor PR to main so the `tip-of-tree` side of tachometer-CI emits the same measurements as `this-change` when the hardening PR runs.
132
134
133
135
Stable-dependency churn (gates Item 9):
134
-
-`reactive-stable-fanout-5000x500` — 5000 reactions each reading the same single signal, 500 invalidations
-`computed-unobserved-200x500` — 200 computed signals derived from a root, no external subscriber, root updated 500 times
141
+
-`computed-subscribe-unsubscribe-10k` — create computed, attach subscriber, detach, repeat 10k times
141
142
142
143
Scheduler allocation (verifies Item 5):
143
-
-`flush-fanout-allocation-200x500` — already specified under Item 5
144
+
-`flush-fanout-allocation-1000x500` — 1000 flush cycles, 500-subscriber fanout each
144
145
145
-
Reaction lifecycle (verifies Item 6):
146
-
-`reaction-create-stop-200kx10` — already specified under Item 6
146
+
**Dropped from original list:**`reaction-stable-deps-10kx1k` (companion measurement redundant with the wide-fan + median-shape pair) and `reaction-create-stop-200kx10` (overlaps existing `sub-unsub-100k`). Five new benches; Item 6 cites existing `sub-unsub-100k` directly.
**Counter:**`Set.delete` + `Set.add` on small sets is fast and allocation-free on modern V8. The existing `reaction-dep-diff-45k` benchmark measures the changing-dependency case; nothing measures stable-deps churn today. The hypothesis may not survive measurement.
176
176
177
177
**Gating:** Item 7's stable-dep benchmarks must show meaningful headroom before this PR lands. Specific thresholds:
178
-
-`reactive-stable-fanout-5000x500` shows ≥2× headroom attributable to Set churn
179
-
-`reactive-stable-deps-3reads-50kx200` confirms in the median shape
178
+
-`reactive-stable-fanout-5000x100` shows ≥2× headroom attributable to Set churn
179
+
-`reactive-stable-deps-3reads-5000x100` confirms in the median shape
Side benefit: this gives natural transactional error recovery. If the callback throws, the partial sweep is skipped and dependencies remain intact for the next run.
0 commit comments