Skip to content

Perf regression: nuget/rescan wall +31% (f3c6313a..17793173; #1340/#1341) #1425

Open

Description

[agent] Bench: nuget/rescan wall time is +31% and nuget/hosted +28% on today's main (17793173), compared with f3c6313a (the previous bench run, 2026-10-09). Request counts are unchanged (53).

Culprit: not bisected. The candidates are the two commits in f3c6313a..17793173 that add NuGet inputs to the hosted engine's discovery and confirm step: e7d8bae4 (#1340, NuGet lock discovery for member and named locks) and ee14e7d7 (#1341, NuGet mapping exclusivity and inherited sources). 10874cc3 (#1344, the stale global-packages warning) is a third, less likely candidate.

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.

scenario round base wall head wall Δ wall [95% CI] Δ CPU requests
nuget/hosted 1 (15+10 pairs) 81.9 ms 100.9 ms +28.4% [+12.5, +34.0] +20.0% 53
nuget/hosted 2 (20+10 pairs) 77.9 ms 95.7 ms +28.2% [+20.6, +38.1] +21.7% 53
nuget/rescan 1 65.1 ms 88.9 ms +34.5% [+24.6, +48.5] +24.7% 53
nuget/rescan 2 61.9 ms 80.8 ms +30.7% [+24.2, +37.2] +23.9% 53

(These numbers use the bench fixture from #1422, which allows #1344's new redirect_nuget_stale_global_package warning. Without that change the head fails validation on main.)

Hot spot

Callgrind on the head binary, nuget/rescan (900 packages, 25 patched, restored project with obj/project.assets.json), inclusive instructions:

41.7%  scan::hosted::run_redirect_selected_untracked
34.8%    hosted::engine::confirm
34.6%      patch::redirect::presence::groups_present
23.5%        aho_corasick::AhoCorasick::new          (automaton build, 1 call)
11.0%        Automaton::try_find_overlapping (27 texts)
14.6%  crawlers::nuget_crawler::parse_project_assets  (4 calls: 2× restore_scope, 2× read_project_assets)
14.8%  vex::discover::nuget::extract

About a third of the scan goes to groups_present, which builds a DFA and scans 27 texts. The new NuGet discovery entries (NUGET_LOCKS_KEY / inherited-sources texts, plus the extra lock files read in) now feed into it. obj/project.assets.json is also parsed into a serde_json::Value four times per scan.

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 '^nuget/' --runs 20

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


Generated by Claude Code

Activity

  1. mikolalysenko commented on Oct 12, 2026

    @mikolalysenko
    CollaboratorAuthor

    [agent] Bench: context from the weekly A/B in the same run. Base 045d7ec7 (2026-10-05) → head 17793173, 8+8 pairs: nuget/hosted is -1.7% and nuget/rescan is +3.9%, both ≈. Between 045d7ec7 and f3c6313a, #1183 (the restore-scoped crawl) made the NuGet scans 13–21% faster. This regression gives most of that gain back, so the fix target is the f3c6313a level (≈62–78 ms on this runner), not the week-old one.


    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