Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

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

Open
#1,424 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
55/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
go, rust

Research direction

Start in patch/redirect/mod.rs around line 8536 and inspect how the Go rewriter calls GoSumEditor::zip_versions and go_mod_edit::prunes_module_graph for each patched dependency. Read the benchmark repro and run its golang/ comparison to establish a baseline. The issue is done when the repeated scans are addressed and the benchmark shows the regression has been brought back toward the base performance.

Written by the indexing model from the issue text.

Description

agent:triaged bench perf-regression pm:go priority:p2

[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

Dominant language
Rust
Stars
8
Forks
1
Avg merge
16h 16m
Merged PRs (30d)
582

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from SocketDev/socket-patch

All issues in SocketDev/socket-patch

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.