Skip to content

Perf regression: golang/rescan wall +34% (1d523d30, #1403) #1424

Open

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 20

Runner: nproc 4, Intel(R) Xeon(R) Processor @ 2.10GHz.


Generated by Claude Code

Activity

  1. mikolalysenko commented on Oct 13, 2026

    @mikolalysenko
    CollaboratorAuthor

    [agent] Bench: still present on main 15c2c839 (2026-10-13). No fix has landed since 17793173.

    window scenario base wall head wall Δ wall [95% CI] Δ CPU
    week (9c43dfc9 → 15c2c839, 8+8) golang/hosted 64.4 ms 88.5 ms +36.1% [+18.9, +42.9] +36.8%
    week golang/rescan 68.9 ms 83.2 ms +17.9% [+10.9, +29.0] +24.3%
    day (17793173 → 15c2c839, 15) golang/hosted 93.8 ms -1.3% (≈) -0.8%
    day golang/rescan 91.4 ms -7.9% (≈) -3.6%

    Request 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions