Repository navigation
Perf regression: golang/rescan wall +34% (1d523d30, #1403) #1424
Description
[agent] Bench: golang/rescan wall time is +34% and golang/hosted +23% on today's main (17793173), compared with f3c6313a (the previous bench run, 2026-10-09). Request counts are unchanged (64).
Culprit: 1d523d30, #1403 ("Fix Go replace for unselected versions (#391, #392, #509)"). Profiling found it: the hot function, GoSumEditor::zip_versions, was introduced by that commit. It was not bisected with builds.
Same-machine interleaved compare
Base f3c6313a → head 17793173, on a 4 vCPU Intel Xeon @ 2.10GHz cloud sandbox. An A/A run on the same machine was clean (golang/rescan +2.6%, ≈).
| scenario | round | base wall | head wall | Δ wall [95% CI] | Δ CPU | requests |
|---|---|---|---|---|---|---|
golang/hosted |
1 (15+10 pairs) | 73.0 ms | 94.5 ms | +27.3% [+18.5, +36.3] | +26.8% | 64 |
golang/hosted |
2 (20+10 pairs) | 70.6 ms | 87.2 ms | +23.4% [+14.6, +32.1] | +27.7% | 64 |
golang/rescan |
1 | 67.1 ms | 95.2 ms | +45.5% [+33.9, +51.1] | +37.2% | 64 |
golang/rescan |
2 | 67.0 ms | 88.2 ms | +34.3% [+26.4, +39.0] | +31.0% | 64 |
Hot spot
Callgrind on the head binary, golang/rescan (1200 modules, 30 patched), inclusive instructions:
68.3% patch::redirect::rewriter_groups::{{closure}}
30.4% vendor::go_sum_edit::GoSumEditor::zip_versions
29.0% <SplitWhitespace as Iterator>::next
15.9% vendor::go_mod_edit::scan_hosted_replace
10.3% go_mod_edit::strip_comment
The golang rewriter (patch/redirect/mod.rs, around line 8536) calls go_sum.zip_versions(&fname) once per patched dep, and each call splits every line of go.sum. That makes it O(patched deps × go.sum lines). go_mod_edit::prunes_module_graph(&go_mod) is also evaluated per dep. One pass over go.sum that builds a module → zip versions map, plus a single prunes_module_graph read hoisted out of the loop, should bring it back.
Repro
export CARGO_PROFILE_PERF_INHERITS=release CARGO_PROFILE_PERF_LTO=thin CARGO_PROFILE_PERF_STRIP=none
git worktree add /tmp/base f3c6313a && (cd /tmp/base && CARGO_TARGET_DIR=/tmp/tb cargo build --locked --profile perf -p socket-patch-cli)
CARGO_TARGET_DIR=/tmp/th cargo build --locked --profile perf -p socket-patch-cli -p socket-patch-bench
/tmp/th/perf/socket-patch-bench compare --base /tmp/tb/perf/socket-patch --head /tmp/th/perf/socket-patch -f '^golang/' --runs 20Runner: nproc 4, Intel(R) Xeon(R) Processor @ 2.10GHz.
Generated by Claude Code
Activity
mikolalysenko commentedon Oct 13, 2026
[agent] Bench: still present on main
15c2c839(2026-10-13). No fix has landed since17793173.9c43dfc9→15c2c839, 8+8)golang/hostedgolang/rescan17793173→15c2c839, 15)golang/hostedgolang/rescanRequest counts are unchanged (64). A/A on the same runner was clean. Runner: 4 vCPU, Intel(R) Xeon(R) Processor @ 2.10GHz.
Generated by Claude Code