Skip to content

validate: mem-anchor contention normalization (no-op A/B) - #16

Closed
mparrett wants to merge 1 commit into
perf/mem-anchorfrom
perf/mem-anchor-noop
Closed

validate: mem-anchor contention normalization (no-op A/B)#16
mparrett wants to merge 1 commit into
perf/mem-anchorfrom
perf/mem-anchor-noop

Conversation

@mparrett

Copy link
Copy Markdown
Owner

Fork-only validation of the memory-aware anchor (stacked on the median-of-N gate #14).

Setup. Base branch perf/mem-anchor already carries BenchmarkRatchetMemAnchor + the gate driver's mem-normalization, so both base and head snapshots have the mem anchor to normalize against. The head is a comment-only no-op → same VM code both sides → every gate is a false positive (must be 0). The perf-pr-repeat gate reports raw (÷cpu anchor) alongside mem-normalized (÷mem anchor) deltas.

What to look for. Under real CI memory contention, the raw worst-family |median| should exceed the mem-normalized one — the phantom the CPU anchor can't normalize. Deterministic proof of the mechanism (a +20% raw phantom → 0% mem-normalized) is in the driver's synthetic differential; this run measures it on a contended runner.

Not for merge — validation only. Landing the benchmark on main is gated on generalizing bench-ratchet's anchor detection to a predicate (coordinated, sequenced on nooga#22).

Same VM code as perf/mem-anchor (base), so the repeat A/B is same-code — every
gate is a false positive. Both sides carry BenchmarkRatchetMemAnchor, so the
mem-normalized column is active. Comment-only change to trigger perf-pr-repeat.
@mparrett mparrett added the perf-repeat Run the repeat A/B (variance-reduced) perf gate label Jul 12, 2026
@mparrett

Copy link
Copy Markdown
Owner Author

Closing — validation complete, negative result.

The memory-aware anchor does not work: across 5 contended-CI samples the per-family β (family-swing regressed on anchor-swing, per cycle) is pure scatter (−0.58 to +2.66) with no co-variation, and full ÷mem normalization injects the anchor's own volatility (worst |median| 4.09% raw → 13.23% ÷mem on the run where the anchor swung ±14%). Root cause is structural: go test -bench measures the anchor and each family sequentially (seconds apart), so they can't share the instantaneous contention the normalization assumes.

The N=7 median-of-N + ABBA gate holds 0 false positives across 10 runs without it. Branches kept as the shelved-prototype record.

@mparrett mparrett closed this Jul 12, 2026
@mparrett
mparrett deleted the perf/mem-anchor-noop branch July 12, 2026 18:55
mparrett added a commit that referenced this pull request Jul 13, 2026
test262.total is a mean over the passing set (perf-timeline #16), whose
membership drifts as conformance changes. Where a point's set_hash differs from
its predecessor the mean isn't over the same workload, so the slope across that
gap isn't a pure engine delta (nooga#26, the nooga#23 segmentation follow-on). Dash the
connecting span, mark the changed point with a triangle, add a tooltip + count
note — so a composition jump reads differently from a real engine move.

Also fixes the ?mode= param regression from the tab rename: match
case-insensitively so old ?mode=all / ?mode=overall links still resolve.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mparrett added a commit that referenced this pull request Jul 18, 2026
Replace the "#16 should gate on set_hash" note (an exact-match gate degenerates
on the timeline — the passing set drifts on nearly every point) with: segment
the line at set_hash changes, keep the hash as a diagnostic. Add the sum-vs-
conformance metric confound as follow-on nooga#26.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mparrett added a commit that referenced this pull request Jul 25, 2026
test262.total is a mean over the passing set (perf-timeline #16), whose
membership drifts as conformance changes. Where a point's set_hash differs from
its predecessor the mean isn't over the same workload, so the slope across that
gap isn't a pure engine delta (nooga#26, the nooga#23 segmentation follow-on). Dash the
connecting span, mark the changed point with a triangle, add a tooltip + count
note — so a composition jump reads differently from a real engine move.

Also fixes the ?mode= param regression from the tab rename: match
case-insensitively so old ?mode=all / ?mode=overall links still resolve.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

perf-repeat Run the repeat A/B (variance-reduced) perf gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant