Skip to content
v7 is in preview. Install it with dotnet tool install dotnet-affected --prerelease, and see what changed since v6.

Performance

v7 against v6.2.0, on a 2,000-project repository

6.5× faster

727s at v6.2.0 against 111s at v7. At 250 projects it is 1.3× — the gap widens with repository size.

Every figure on this page compares v7 against v6.2.0, the last v6 release, over identical generated repositories. The larger the repository, the more v7 saves — which is the point worth taking from this page, since large repositories are what this tool is for.

How much fasterSpeedup over v6.2.0, by repository size. Higher is better.
250 projects: 1.3× faster ( 7.80s → 5.90s) 2501.3× 500 projects: 1.6× faster ( 17.1s → 10.9s) 5001.6× 1,000 projects: 2.8× faster ( 79.9s → 28.1s) 1,0002.8× 2,000 projects: 6.5× faster ( 727s → 111s) 2,0006.5×no change
Wall clock per runMean of the measured iterations. The axis is logarithmic — each gridline is ten times the last.
v6.2.0v71s10s100s1000s 250 projects: v6.2.0 7.80s, v7 5.90s (1.3× faster) 2507.80s 500 projects: v6.2.0 17.1s, v7 10.9s (1.6× faster) 50017.1s 1,000 projects: v6.2.0 79.9s, v7 28.1s (2.8× faster) 1,00079.9s 2,000 projects: v6.2.0 727s, v7 111s (6.5× faster) 2,000727s

Row labels are total projects. Exact numbers, spread and iteration counts are in the table below.

ProjectsGraph nodesv6.2.0v7ChangeSpeedupIterations
2501,0007.80s± 6.28%5.90s± 7.29%-24.4%1.32×10
5002,00017.1s± 2.57%10.9s± 2.12%-36.4%1.57×10
1,0004,00079.9s± 1.95%28.1s± 2.42%-64.8%2.84×10
2,0008,000727s± 1.41%111s± 4.4%-84.7%6.52×5

Both versions produced the same affected projects at every size, so this is not one of them doing less work: the run at 2,000 projects reports 1,994 affected out of 2,000.

Cost growth per doubling, as an exponent: 1 is linear, 2 quadratic, 3 cubic.

Stepv6.2.0v7
250 → 5001.1320.882
500 → 1,0002.2251.371
1,000 → 2,0003.1851.986

v6’s cost climbs from roughly linear to worse than quadratic as the repository grows. v7’s stays under 2 across the same range. Neither exponent is constant, so neither should be extrapolated past the largest size measured.

Baseline v6.2.0 (a88f3d63)
Candidate main (699ebb47)
Invocation dotnet-affected -p <repo> --dry-run --format text
Repository shape Generated csproj tree, 20 children per project, one added .cs file in every fifth project, committed clean then dirtied.
CPU AMD Ryzen 7 PRO 8840U w/ Radeon 780M Graphics
OS fedora 44, Linux 7.1.5-201.fc44.x86_64 x86_64
.NET SDK 10.0.201
MSBuild 18.3.0-release-26153-122+4d3023de6
Configuration Release

Measurement is at the process level: the executables are run and timed, so startup and MSBuild load count, which is what a user actually waits for. One warmup run per version is discarded, and the two versions alternate so drift affects both equally.

Part of v7’s gain comes from discovery no longer walking .git or gitignored paths, not only from the graph work. The BenchmarkDotNet suites run on every push to main and isolate the algorithm from discovery; this page is the end-to-end view.

Reproducing the whole comparison takes about 1.9 hours of wall clock, most of it spent on the baseline at the largest size.

Every figure here is generated from a JSON snapshot committed alongside the site, one per release, under docs/src/data/benchmarks/. The snapshots hold the raw per-iteration timings where they were captured, and every derived field — change, speedup, cost ratio, exponent — is computed rather than transcribed. Snapshots are never regenerated: a published comparison that changes underneath a reader is not a comparison.

v7.0.0 is the first release with a published comparison.