perf: fix dictionary double-lookups, Collection.Contains, and LINQ allocations - #15533
Jakub Jareš (nohwnd) merged 5 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
Performance-focused refactor to reduce redundant dictionary lookups/iterations and cut per-call allocations, with a small concurrency-safety improvement in run stats aggregation.
Changes:
- Replaced
ContainsKey+ indexer patterns withTryGetValueto avoid double lookups. - Switched invoked data collector tracking to a
HashSetto avoid O(n²).Contains()patterns. - Removed a per-element array allocation in LINQ predicates by using static precomputed key sets.
Reviewed changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/Parallel/ParallelRunDataAggregatorTests.cs | Updated assertions for HashSet semantics and strengthened thread-safety test by adding a concurrent reader task. |
| src/vstest.console/Processors/EnableBlameArgumentProcessor.cs | Replaced per-element new[] allocations in LINQ filters with static key sets. |
| src/Microsoft.TestPlatform.ObjectModel/Navigation/PortableSymbolReader.cs | Simplified nested dictionary lookups via TryGetValue. |
| src/Microsoft.TestPlatform.ObjectModel/Navigation/FullSymbolReader.cs | Eliminated redundant dictionary lookups using TryGetValue. |
| src/Microsoft.TestPlatform.ObjectModel/DataCollector/InProcDataCollector/TestSessionStartArgs.cs | Replaced double-lookup dictionary access with TryGetValue. |
| src/Microsoft.TestPlatform.ObjectModel/DataCollector/Events/SessionEvents.cs | Replaced double-lookup dictionary access with TryGetValue. |
| src/Microsoft.TestPlatform.ObjectModel/ConnectionInfo/TestRunnerConnectionInfoExtensions.cs | Reduced string concatenation operations by consolidating into one interpolated assignment. |
| src/Microsoft.TestPlatform.CrossPlatEngine/TestSession/TestSessionPool.cs | Reduced redundant dictionary lookups in session pool access. |
| src/Microsoft.TestPlatform.CrossPlatEngine/TestSession/ProxyTestSessionManager.cs | Reduced redundant dictionary lookups when resolving proxy indices. |
| src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/ParallelDataCollectionEventsHandler.cs | Adapted to HashSet by materializing to Collection<T> for downstream APIs. |
| src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionSink.cs | Reduced redundant dictionary lookups and simplified update flow. |
| src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/ParallelRunEventsHandler.cs | Adapted to HashSet by materializing to Collection<T> for downstream APIs. |
| src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/ParallelRunDataAggregator.cs | Switched invoked collectors to HashSet, added locking in stats aggregation, and reduced redundant lookups. |
| src/Microsoft.TestPlatform.Common/Utilities/SimpleJSON.cs | Removed redundant dictionary lookups and simplified add/update/remove logic. |
|
brain is not braining anymore, will have a look on monday, sorry! |
| var testOutcomeMap = new Dictionary<TestOutcome, long>(); | ||
| long totalTests = 0; | ||
| if (_testRunStatsList.Count > 0) | ||
| lock (_dataUpdateSyncObject) |
There was a problem hiding this comment.
FYI: This was reverted before, this is called once at the end, not in parallel. Same with part of the test reverted before on the bottom.
Won't hurt most likely just sets unrealistic expectations from the api, that will confuse us if we end up replacing the method with other code.
| // Also start a reader thread that calls GetAggregatedRunStats concurrently | ||
| var readerTask = Task.Run(() => | ||
| { | ||
| barrier.SignalAndWait(); | ||
| for (int i = 0; i < iterationsPerThread; i++) | ||
| { | ||
| // This must not throw InvalidOperationException due to collection modification | ||
| var runStats = aggregator.GetAggregatedRunStats(); | ||
| Assert.IsTrue(runStats.ExecutedTests >= 0, "Executed tests count should be non-negative"); | ||
| } | ||
| }); | ||
|
|
||
| Task.WaitAll(aggregateTasks.Append(readerTask).ToArray()); |
There was a problem hiding this comment.
This is the part I talk about above. Also the barrier.
|
looking |
Address review comments from PR microsoft#15533: - Revert HashSet<InvokedDataCollector> back to Collection with Contains, as this code runs once at end, not in parallel (nohwnd feedback) - Add clarifying comment to Aggregate method about non-parallel usage - Revert barrier-based parallel test back to simpler sequential version (nohwnd feedback - was reverted before) - Revert test assertions to index-based access (order is deterministic with Collection) - Change BlameParameterNames from string[] to HashSet<string> with OrdinalIgnoreCase comparer for O(1) Contains lookups (Copilot/Youssef) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Address review comments from PR #15533: - Revert HashSet<InvokedDataCollector> back to Collection with Contains, as this code runs once at end, not in parallel (nohwnd feedback) - Add clarifying comment to Aggregate method about non-parallel usage - Revert barrier-based parallel test back to simpler sequential version (nohwnd feedback - was reverted before) - Revert test assertions to index-based access (order is deterministic with Collection) - Change BlameParameterNames from string[] to HashSet<string> with OrdinalIgnoreCase comparer for O(1) Contains lookups (Copilot/Youssef) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
| IDiaEnumSymbols? enumSymbols = null; | ||
| IDiaSymbol? methodSymbol; | ||
| Dictionary<string, IDiaSymbol> methodSymbolsForType; | ||
| Dictionary<string, IDiaSymbol>? methodSymbolsForType; |
There was a problem hiding this comment.
Making methodSymbolsForType nullable here reduces clarity: it is expected to be non-null in the TryGetValue(...) true-branch, and (based on the structure) likely initialized in the else branch later. To keep nullability accurate and avoid downstream nullability noise, consider using a non-null local inside the if (e.g., out var methodSymbolsForType) and/or ensuring the variable is always assigned a non-null dictionary before any later use.
| Dictionary<string, IDiaSymbol>? methodSymbolsForType; | |
| Dictionary<string, IDiaSymbol> methodSymbolsForType; |
| if (_methodSymbols.TryGetValue(symbolName, out methodSymbolsForType)) | ||
| { | ||
| methodSymbolsForType = _methodSymbols[symbolName]; | ||
| if (methodSymbolsForType.ContainsKey(methodName)) | ||
| if (methodSymbolsForType.TryGetValue(methodName, out var cachedMethodSymbol)) | ||
| { | ||
| return methodSymbolsForType[methodName]; | ||
| return cachedMethodSymbol; | ||
| } | ||
| } |
There was a problem hiding this comment.
Making methodSymbolsForType nullable here reduces clarity: it is expected to be non-null in the TryGetValue(...) true-branch, and (based on the structure) likely initialized in the else branch later. To keep nullability accurate and avoid downstream nullability noise, consider using a non-null local inside the if (e.g., out var methodSymbolsForType) and/or ensuring the variable is always assigned a non-null dictionary before any later use.
| // Note: This method is called once at the end of the test run to aggregate results. | ||
| // It is NOT called in parallel, so thread-safety optimizations here would be misleading. |
There was a problem hiding this comment.
The new note contradicts the XML doc immediately above it: the doc states this must be thread-safe and expected to be called by parallel managers, while the note says it is not called in parallel. Please reconcile these (either update the XML doc to match actual usage, or remove/adjust the note) so future changes don’t rely on conflicting guidance.
| // Note: This method is called once at the end of the test run to aggregate results. | |
| // It is NOT called in parallel, so thread-safety optimizations here would be misleading. |
There was a problem hiding this comment.
note belongs to GetAggregatedRunStats
| if (CollectionData.ContainsKey(key)) | ||
| { | ||
| EqtTrace.Warning("The data for in-proc data collector with key {0} has already been set. Will be reset with new value", key); | ||
| CollectionData[key] = value; | ||
| } | ||
| CollectionData[key] = value; |
There was a problem hiding this comment.
This path still does a double-lookup (ContainsKey then indexer assignment). Since this PR targets dictionary lookup reductions, consider switching to TryAdd (warn+overwrite if it returns false) or TryGetValue to keep the warning behavior while avoiding an extra hash lookup on the common add path.
…locations - Replace ContainsKey + indexer with TryGetValue across 10+ locations (ParallelRunDataAggregator, TestSessionPool, ProxyTestSessionManager, InProcDataCollectionSink, PortableSymbolReader, FullSymbolReader, TestSessionStartArgs, SessionEvents, SimpleJSON) - Change Collection<InvokedDataCollector> to HashSet<InvokedDataCollector> in ParallelRunDataAggregator for O(1) dedup instead of O(n) - Extract static HashSets for blame parameter names instead of allocating new[] per LINQ predicate evaluation - Consolidate string += into string interpolation in TestRunnerConnectionInfoExtensions
Address review comments from PR #15533: - Revert HashSet<InvokedDataCollector> back to Collection with Contains, as this code runs once at end, not in parallel (nohwnd feedback) - Add clarifying comment to Aggregate method about non-parallel usage - Revert barrier-based parallel test back to simpler sequential version (nohwnd feedback - was reverted before) - Revert test assertions to index-based access (order is deterministic with Collection) - Change BlameParameterNames from string[] to HashSet<string> with OrdinalIgnoreCase comparer for O(1) Contains lookups (Copilot/Youssef) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove lock and non-parallel note from GetAggregatedRunStats (called once at end, not in parallel - lock was reverted before) - Keep TryGetValue and kvp iteration optimizations - Restore non-nullable Dictionary<string, IDiaSymbol> in FullSymbolReader Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
bc0b5f6 to
038b6c5
Compare
| _runDataAggregator.GetAggregatedException(), | ||
| _runDataAggregator.RunContextAttachments, | ||
| _runDataAggregator.InvokedDataCollectors, | ||
| new Collection<InvokedDataCollector>(_runDataAggregator.InvokedDataCollectors.ToList()), |
There was a problem hiding this comment.
This materializes a new List<T> via ToList() and then wraps it in a new Collection<T>, adding allocations on the completion path. If the downstream API can be adjusted, prefer accepting IReadOnlyCollection<T> / IEnumerable<T> to avoid forcing a copy. If the signature cannot change, consider passing a one-time snapshot that is created earlier (or reusing a cached snapshot) so this call site doesn't allocate on every completion.
| new Collection<InvokedDataCollector>(_runDataAggregator.InvokedDataCollectors.ToList()), | |
| _runDataAggregator.InvokedDataCollectors.ToList(), |
|
blocked on flakiness from main |
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) | `17.14.1` → `18.9.0` |  |  | --- ### Release Notes <details> <summary>microsoft/vstest (Microsoft.NET.Test.Sdk)</summary> ### [`v18.9.0`](https://github.com/microsoft/vstest/releases/tag/v18.9.0) ##### What's Changed - Fix tilde/exclamation characters corrupted in TerminalLogger test output by [@​nohwnd](https://github.com/nohwnd) in [#​16046](microsoft/vstest#16046) - Make TranslationLayer Native AOT-compatible by [@​drewnoakes](https://github.com/drewnoakes) in [#​16045](microsoft/vstest#16045) - Guard GenerateProgramFile target against UseWinUI/UseUwpTools evaluation order by [@​nohwnd](https://github.com/nohwnd) in [#​16072](microsoft/vstest#16072) - Add RequestingAssembly to AssemblyResolveEventArgs for binary compat by [@​nohwnd](https://github.com/nohwnd) in [#​16076](microsoft/vstest#16076) - Remove stale Microsoft.Extensions.FileSystemGlobbing binding redirect from testhost.x86 and datacollector by [@​Evangelink](https://github.com/Evangelink) in [#​16082](microsoft/vstest#16082) - Fix TRX attachment paths when LogFileName contains a subdirectory by [@​nohwnd](https://github.com/nohwnd) in [#​15791](microsoft/vstest#15791) - Fix missing dumps for .NET Framework child processes in NetClientHangDumper by [@​nohwnd](https://github.com/nohwnd) in [#​16098](microsoft/vstest#16098) - Fix data collection channels to use negotiated protocol version instead of V1 by [@​nohwnd](https://github.com/nohwnd) in [#​16096](microsoft/vstest#16096) - Fix race condition in BlameCollector: skip hang dump when testhost hasn't launched yet by [@​nohwnd](https://github.com/nohwnd) in [#​16065](microsoft/vstest#16065) - Replace TestSDKAutoGeneratedCode with ExcludeFromCodeCoverage in auto-generated Program files by [@​nohwnd](https://github.com/nohwnd) in [#​16101](microsoft/vstest#16101) - Include testhost process path in crash error messages by [@​nohwnd](https://github.com/nohwnd) in [#​16108](microsoft/vstest#16108) - Fix DataDriven test results being double-counted in TRX logger totals by [@​nohwnd](https://github.com/nohwnd) in [#​15766](microsoft/vstest#15766) - Fix datacollector crash visibility: replace Assert with throwable exceptions by [@​nohwnd](https://github.com/nohwnd) in [#​16048](microsoft/vstest#16048) - Add TreatErrorMessagesAsWarnings parameter to TRX logger by [@​nohwnd](https://github.com/nohwnd) in [#​16106](microsoft/vstest#16106) - Wait for testhost stderr to drain before reading its crash output by [@​nohwnd](https://github.com/nohwnd) in [#​16128](microsoft/vstest#16128) - Handle runtimeconfig.dev.json without additionalProbingPaths by [@​tmat](https://github.com/tmat) in [#​16166](microsoft/vstest#16166) - Suggest Microsoft.NET.Test.Sdk when a managed test project brings no testhost by [@​nohwnd](https://github.com/nohwnd) in [#​16169](microsoft/vstest#16169) - Fix x86 testhost loading mismatched x64 hostfxr (0x800700C1) when run via vstest.console.exe directly ([#​16151](microsoft/vstest#16151)) by [@​azat-msft](https://github.com/azat-msft) in [#​16156](microsoft/vstest#16156) - Preserve the real exception (type + stack trace) when a test run aborts in BaseRunTests by [@​nohwnd](https://github.com/nohwnd) in [#​16167](microsoft/vstest#16167) ##### New Contributors - [@​drewnoakes](https://github.com/drewnoakes) made their first contribution in [#​16045](microsoft/vstest#16045) **Full Changelog**: <microsoft/vstest@v18.8.0...v18.9.0> ### [`v18.8.1`](https://github.com/microsoft/vstest/releases/tag/v18.8.1) ##### What's Changed - Fix protocol negotiation timeout when STJ reflection is disabled (18.8.1) by [@​nohwnd](https://github.com/nohwnd) in [#​16281](microsoft/vstest#16281) **Full Changelog**: <microsoft/vstest@v18.8.0...v18.8.1> ### [`v18.8.0`](https://github.com/microsoft/vstest/releases/tag/v18.8.0) ##### What's Changed - Migrate from Newtonsoft.Json to System.Text.Json / Jsonite (merge to main) by [@​nohwnd](https://github.com/nohwnd) in [#​15687](microsoft/vstest#15687) - For more detail refer to <https://devblogs.microsoft.com/dotnet/vs-test-is-removing-its-newtonsoft-json-dependency/> - Create source-only filter package by [@​Youssef1313](https://github.com/Youssef1313) in [#​15638](microsoft/vstest#15638) - Add ARM64 msdia140.dll support to test platform packages by [@​nohwnd](https://github.com/nohwnd) in [#​15692](microsoft/vstest#15692) - Fix mutex cleanup crash on macOS/Linux by [@​nohwnd](https://github.com/nohwnd) in [#​15684](microsoft/vstest#15684) - Restrict artifact temp directory permissions on Unix by [@​nohwnd](https://github.com/nohwnd) in [#​15729](microsoft/vstest#15729) - Add support for filtering uncategorized tests with TestCategory=None by [@​Evangelink](https://github.com/Evangelink) in [#​15727](microsoft/vstest#15727) - Fix SCI binding failure in DTA hosts (main) by [@​nohwnd](https://github.com/nohwnd) in [#​15724](microsoft/vstest#15724) - Fix HTML logger parallel file collision by [@​nohwnd](https://github.com/nohwnd) in [#​15435](microsoft/vstest#15435) - Improve error message when testhost cannot be found by [@​nohwnd](https://github.com/nohwnd) in [#​16053](microsoft/vstest#16053) - Fix HTML logger exception on invalid XML chars in test display names by [@​nohwnd](https://github.com/nohwnd) in [#​16051](microsoft/vstest#16051) **Full Changelog**: <microsoft/vstest@v18.7.0...v18.8.0> ### [`v18.7.0`](https://github.com/microsoft/vstest/releases/tag/v18.7.0) ##### What's Changed - Add ARM64 msdia140.dll support to test platform packages by [@​jamesmcroft](https://github.com/jamesmcroft) in [#​15689](microsoft/vstest#15689) - Update System.Memory from 4.5.5 to 4.6.3 by [@​nohwnd](https://github.com/nohwnd) in [#​15706](microsoft/vstest#15706) ##### New Contributors - [@​jamesmcroft](https://github.com/jamesmcroft) made their first contribution in [#​15689](microsoft/vstest#15689) **Full Changelog**: <microsoft/vstest@v18.6.0...v18.7.0> ### [`v18.6.0`](https://github.com/microsoft/vstest/releases/tag/v18.6.0) ##### What's Changed - Revert removal of Video Recorder by [@​nohwnd](https://github.com/nohwnd) in [#​15336](microsoft/vstest#15336) - Speed up blame by filtering non-.NET processes from dump collection by [@​nohwnd](https://github.com/nohwnd) in [#​15518](microsoft/vstest#15518) - Add README.md to NuGet packages by [@​nohwnd](https://github.com/nohwnd) in [#​15550](microsoft/vstest#15550) - Report child process info on connection timeout by [@​nohwnd](https://github.com/nohwnd) in [#​15603](microsoft/vstest#15603) ##### Changes to tests and infra - Brand as 18.6 by [@​nohwnd](https://github.com/nohwnd) in [#​15423](microsoft/vstest#15423) - Upgrading code coverage version to 18.5.1, by [@​fhnaseer](https://github.com/fhnaseer) in [#​15422](microsoft/vstest#15422) - Updating System.Collections.Immutable to 9.0.11 by [@​MSLukeWest](https://github.com/MSLukeWest) in [#​15425](microsoft/vstest#15425) - Fix attachVS when used for debugging integration tests by [@​nohwnd](https://github.com/nohwnd) in [#​15451](microsoft/vstest#15451) - Replace dotnet.config, with global.json by [@​nohwnd](https://github.com/nohwnd) in [#​15449](microsoft/vstest#15449) - Document debugging integration tests with AttachVS by [@​Copilot](https://github.com/Copilot) in [#​15452](microsoft/vstest#15452) - Fix stack overflow tests by [@​nohwnd](https://github.com/nohwnd) in [#​15461](microsoft/vstest#15461) - Make TestAssets.sln buildable locally by [@​Youssef1313](https://github.com/Youssef1313) in [#​15466](microsoft/vstest#15466) - Try filtering out tests by [@​nohwnd](https://github.com/nohwnd) in [#​15463](microsoft/vstest#15463) - Build just once when tfms run in parallel by [@​nohwnd](https://github.com/nohwnd) in [#​15465](microsoft/vstest#15465) - Review simplify compatibility sources, deduplicate tests by [@​nohwnd](https://github.com/nohwnd) in [#​15472](microsoft/vstest#15472) - Cleanup dead TRX code by [@​Youssef1313](https://github.com/Youssef1313) in [#​15474](microsoft/vstest#15474) - Update .NET runtimes to 8.0.25, 9.0.14, and 10.0.4 by [@​nohwnd](https://github.com/nohwnd) in [#​15481](microsoft/vstest#15481) - Compat matrix checker by [@​nohwnd](https://github.com/nohwnd) in [#​15480](microsoft/vstest#15480) - Add trx analysis skill by [@​nohwnd](https://github.com/nohwnd) in [#​15486](microsoft/vstest#15486) - Split integration tests to single tfm and multi tfm project by [@​nohwnd](https://github.com/nohwnd) in [#​15484](microsoft/vstest#15484) - Update matrix by [@​nohwnd](https://github.com/nohwnd) in [#​15477](microsoft/vstest#15477) - Break infinite restore loop in VS by [@​nohwnd](https://github.com/nohwnd) in [#​15503](microsoft/vstest#15503) - Use global package cache for build, and local for running integration tests by [@​nohwnd](https://github.com/nohwnd) in [#​15500](microsoft/vstest#15500) - Update contributing by [@​nohwnd](https://github.com/nohwnd) in [#​15505](microsoft/vstest#15505) - Reduce test wall-clock time by increasing minThreads by [@​drognanar](https://github.com/drognanar) in [#​15502](microsoft/vstest#15502) - Indicator flakiness by [@​nohwnd](https://github.com/nohwnd) in [#​15513](microsoft/vstest#15513) - Fix ci build by [@​nohwnd](https://github.com/nohwnd) in [#​15515](microsoft/vstest#15515) - Fix thread safety issues by [@​Evangelink](https://github.com/Evangelink) in [#​15512](microsoft/vstest#15512) - Optimize DotnetSDKSimulation\_PostProcessing test (163s → 61s) by [@​nohwnd](https://github.com/nohwnd) in [#​15516](microsoft/vstest#15516) - Build isolated test assets for single TFM instead of 7 by [@​nohwnd](https://github.com/nohwnd) in [#​15517](microsoft/vstest#15517) - Remove unused dependencies from Library.IntegrationTests by [@​nohwnd](https://github.com/nohwnd) in [#​15527](microsoft/vstest#15527) - Remove printing \_attachments content to console by [@​nohwnd](https://github.com/nohwnd) in [#​15520](microsoft/vstest#15520) - Add Linux/macOS test filtering guide to CONTRIBUTING.md by [@​nohwnd](https://github.com/nohwnd) in [#​15521](microsoft/vstest#15521) - Change integration test parallelization from ClassLevel to MethodLevel by [@​nohwnd](https://github.com/nohwnd) in [#​15526](microsoft/vstest#15526) - Unify target framework checks with IsNetFrameworkTarget/IsNetTarget by [@​nohwnd](https://github.com/nohwnd) in [#​15523](microsoft/vstest#15523) - Add unattended work instructions to copilot-instructions.md by [@​nohwnd](https://github.com/nohwnd) in [#​15531](microsoft/vstest#15531) - Reduce code style rule severity from warning to suggestion by [@​nohwnd](https://github.com/nohwnd) in [#​15522](microsoft/vstest#15522) - Remove Debug/Release line number branching from tests by [@​nohwnd](https://github.com/nohwnd) in [#​15519](microsoft/vstest#15519) - Revise unattended work instructions in copilot-instructions.md by [@​nohwnd](https://github.com/nohwnd) in [#​15532](microsoft/vstest#15532) - Improve CompatibilityRowsBuilder error message with diagnostic details by [@​nohwnd](https://github.com/nohwnd) in [#​15529](microsoft/vstest#15529) - docs: add git worktree and upstream sync workflow to copilot-instructions.md by [@​nohwnd](https://github.com/nohwnd) in [#​15538](microsoft/vstest#15538) - Add VSIX runner to smoke tests by [@​nohwnd](https://github.com/nohwnd) in [#​15541](microsoft/vstest#15541) - Remove deprecated WebTest and TMI test methods by [@​nohwnd](https://github.com/nohwnd) in [#​15525](microsoft/vstest#15525) - Fix compatibility test failures for legacy vstest.console and MSTest adapter by [@​nohwnd](https://github.com/nohwnd) in [#​15534](microsoft/vstest#15534) - Convert TestPlatform.sln to slnx format by [@​nohwnd](https://github.com/nohwnd) in [#​15551](microsoft/vstest#15551) - Convert test/TestAssets .sln files to .slnx format by [@​nohwnd](https://github.com/nohwnd) in [#​15557](microsoft/vstest#15557) - Enable parallelization for blame data collector tests by [@​nohwnd](https://github.com/nohwnd) in [#​15552](microsoft/vstest#15552) - Fix CI failure when GeneratedTestAssets directory doesn't exist by [@​nohwnd](https://github.com/nohwnd) in [#​15556](microsoft/vstest#15556) - Set DOTNET\_ROOT in test.sh for local Linux usage by [@​nohwnd](https://github.com/nohwnd) in [#​15559](microsoft/vstest#15559) - Use MSTest recommended analyzers by [@​Evangelink](https://github.com/Evangelink) in [#​15539](microsoft/vstest#15539) - Document semicolon handling in RunSettings test parameters by [@​nohwnd](https://github.com/nohwnd) in [#​15561](microsoft/vstest#15561) - Enable CA1067 analyzer and fix violations by [@​nohwnd](https://github.com/nohwnd) in [#​15560](microsoft/vstest#15560) - Fix HTML logger parallel file collision with atomic file creation by [@​nohwnd](https://github.com/nohwnd) in [#​15562](microsoft/vstest#15562) - Deduplicate package extraction between verify-nupkgs and IntegrationTestBuild by [@​nohwnd](https://github.com/nohwnd) in [#​15554](microsoft/vstest#15554) - Fix MSTEST0046: use Assert.MatchesRegex instead of StringAssert.Matches by [@​nohwnd](https://github.com/nohwnd) in [#​15575](microsoft/vstest#15575) - Attach diagnostic logs to acceptance test runs by [@​nohwnd](https://github.com/nohwnd) in [#​15572](microsoft/vstest#15572) - Deprecate EnableShutdownAfterTestRun which is no-op by [@​Youssef1313](https://github.com/Youssef1313) in [#​15576](microsoft/vstest#15576) - Skip VideoRecorder test on CI due to access denied errors by [@​nohwnd](https://github.com/nohwnd) in [#​15587](microsoft/vstest#15587) - Fix integration test build collision with mutex + EventWaitHandle by [@​nohwnd](https://github.com/nohwnd) in [#​15568](microsoft/vstest#15568) - Reduce blame test flakiness: increase hang dump timeout to 10s by [@​nohwnd](https://github.com/nohwnd) in [#​15590](microsoft/vstest#15590) - Fix concurrent modification in MetricsCollection by [@​nohwnd](https://github.com/nohwnd) in [#​15581](microsoft/vstest#15581) - Fix PassingNoArguments test: disable --diag to preserve help output by [@​nohwnd](https://github.com/nohwnd) in [#​15583](microsoft/vstest#15583) - perf: fix dictionary double-lookups, Collection.Contains, and LINQ allocations by [@​Evangelink](https://github.com/Evangelink) in [#​15533](microsoft/vstest#15533) - Replace VSSDK-sourced DLLs with proper package references by [@​nohwnd](https://github.com/nohwnd) in [#​15567](microsoft/vstest#15567) - Add target framework to default TRX file name by [@​nohwnd](https://github.com/nohwnd) in [#​15565](microsoft/vstest#15565) - Update post-build template parameters by [@​nohwnd](https://github.com/nohwnd) in [#​15591](microsoft/vstest#15591) - Fix path for post-build template and adjust validation by [@​nohwnd](https://github.com/nohwnd) in [#​15592](microsoft/vstest#15592) - Add azure-pipelines-official.yml to pipeline files by [@​nohwnd](https://github.com/nohwnd) in [#​15594](microsoft/vstest#15594) - Update comment formatting for signing validation by [@​nohwnd](https://github.com/nohwnd) in [#​15597](microsoft/vstest#15597) - Fix enable-auto-merge for maestro by [@​Youssef1313](https://github.com/Youssef1313) in [#​15595](microsoft/vstest#15595) - Auto-approve maestro PRs by [@​Youssef1313](https://github.com/Youssef1313) in [#​15598](microsoft/vstest#15598) - Update enable-auto-merge to squash by [@​Youssef1313](https://github.com/Youssef1313) in [#​15602](microsoft/vstest#15602) - Update enable-auto-merge.yml for the correct permissions by [@​Youssef1313](https://github.com/Youssef1313) in [#​15606](microsoft/vstest#15606) - Add 365 regression tests for untested bug fixes by [@​nohwnd](https://github.com/nohwnd) in [#​15615](microsoft/vstest#15615) - Fix typos and add comments to empty catch blocks by [@​nohwnd](https://github.com/nohwnd) in [#​15609](microsoft/vstest#15609) - Fix flaky EventLogCollector test: ensure deterministic event log entries by [@​nohwnd](https://github.com/nohwnd) in [#​15607](microsoft/vstest#15607) - Mark PathConverter tests as Windows-only by [@​nohwnd](https://github.com/nohwnd) in [#​15617](microsoft/vstest#15617) - Fix HangDumpOnTimeout flakiness and ignore VideoRecorder test by [@​nohwnd](https://github.com/nohwnd) in [#​15616](microsoft/vstest#15616) - Add copilot-setup-steps.yml by [@​nohwnd](https://github.com/nohwnd) in [#​15604](microsoft/vstest#15604) - Add CreateNoNewWindow RunConfiguration setting by [@​nohwnd](https://github.com/nohwnd) in [#​15585](microsoft/vstest#15585) - Add preview packages documentation by [@​nohwnd](https://github.com/nohwnd) in [#​15628](microsoft/vstest#15628) - Cleanup filter implementation by [@​Youssef1313](https://github.com/Youssef1313) in [#​15629](microsoft/vstest#15629) - Fix SCI binding failure in DTA hosts (rel/18.6) by [@​nohwnd](https://github.com/nohwnd) in [#​15722](microsoft/vstest#15722) - Remove DiagnosticSource binding redirect (rel/18.6) by [@​nohwnd](https://github.com/nohwnd) in [#​15776](microsoft/vstest#15776) **Full Changelog**: <microsoft/vstest@v18.5.1...v18.6.0> ### [`v18.5.1`](https://github.com/microsoft/vstest/releases/tag/v18.5.1) ##### What's Changed - Fix System.Collections.Immutable binding mismatch in Common.dll (rel/18.5) by [@​nohwnd](https://github.com/nohwnd) in [#​15720](microsoft/vstest#15720) - Port verify-binding-redirects.ps1 to rel/18.5 by [@​nohwnd](https://github.com/nohwnd) in [#​15719](microsoft/vstest#15719) - Bump to 18.5.1 by [@​nohwnd](https://github.com/nohwnd) in [#​15721](microsoft/vstest#15721) **Full Changelog**: <microsoft/vstest@v18.5.0...v18.5.1> ### [`v18.5.0`](https://github.com/microsoft/vstest/releases/tag/v18.5.0)⚠️ Unlisted on Nuget, because of [#​15718](microsoft/vstest#15718) ##### What's Changed - Add runtime configs by [@​nohwnd](https://github.com/nohwnd) in [#​15377](microsoft/vstest#15377) - Add net8.0 target for TranslationLayer by [@​nohwnd](https://github.com/nohwnd) in [#​15375](microsoft/vstest#15375) - Determine architecture of remote process on windows by [@​nohwnd](https://github.com/nohwnd) in [#​15396](microsoft/vstest#15396) - Updating System.Collections.Immutable package reference to version 9.0.0 by [@​MSLukeWest](https://github.com/MSLukeWest) in [#​15392](microsoft/vstest#15392) - Dump via netcore tool on windows by [@​nohwnd](https://github.com/nohwnd) in [#​15397](microsoft/vstest#15397) - Fix answer file splitting by [@​nohwnd](https://github.com/nohwnd) in [#​15381](microsoft/vstest#15381) - Run tests against vsix runner by [@​nohwnd](https://github.com/nohwnd) in [#​15419](microsoft/vstest#15419) **Full Changelog**: <microsoft/vstest@v18.4.0...v18.5.0> ### [`v18.4.0`](https://github.com/microsoft/vstest/releases/tag/v18.4.0) ##### What's Changed - Add LoongArch64 support by [@​stdmnpkg](https://github.com/stdmnpkg) in [#​15359](microsoft/vstest#15359) - Refactor Condition evaluation by [@​Youssef1313](https://github.com/Youssef1313) in [#​15357](microsoft/vstest#15357) - Adding info on extensions points part 1 by [@​nohwnd](https://github.com/nohwnd) in [#​15360](microsoft/vstest#15360) - Add option to ask for uploading code QL before the standard window ends by [@​nohwnd](https://github.com/nohwnd) in [#​15373](microsoft/vstest#15373) - Update runtime versions by [@​nohwnd](https://github.com/nohwnd) in [#​15372](microsoft/vstest#15372) - Fix .NET 10 regression for traits by [@​Youssef1313](https://github.com/Youssef1313) in [#​15370](microsoft/vstest#15370) - Update target frameworks to net10.0 and net11.0 by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15349](microsoft/vstest#15349) - Fix names in pipeline matrix so we don't have to align them by [@​nohwnd](https://github.com/nohwnd) in [#​15365](microsoft/vstest#15365) - Update SECURITY.md by [@​Youssef1313](https://github.com/Youssef1313) in [#​15342](microsoft/vstest#15342) ##### New Contributors - [@​stdmnpkg](https://github.com/stdmnpkg) made their first contribution in [#​15359](microsoft/vstest#15359) **Full Changelog**: <microsoft/vstest@v18.3.0...v18.4.0> ### [`v18.3.0`](https://github.com/microsoft/vstest/releases/tag/v18.3.0) ##### What's Changed - Fix answer file splitting by [@​nohwnd](https://github.com/nohwnd) in [#​15306](microsoft/vstest#15306) ##### Internal fixes and updates - Bump branding to 18.1 by [@​nohwnd](https://github.com/nohwnd) in [#​15286](microsoft/vstest#15286) - Remove stale copy of S.ComponentModel.Composition from testplatform packages by [@​ViktorHofer](https://github.com/ViktorHofer) in [#​15287](microsoft/vstest#15287) - Update codeflow metadata to fix backflow by [@​premun](https://github.com/premun) in [#​15291](microsoft/vstest#15291) - \[main] Update dependencies from devdiv/DevDiv/vs-code-coverage by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15283](microsoft/vstest#15283) - Update Microsoft.Build.Utilities.Core by [@​Youssef1313](https://github.com/Youssef1313) in [#​15300](microsoft/vstest#15300) - Disable DynamicNative instrumentation by default by [@​nohwnd](https://github.com/nohwnd) in [#​15299](microsoft/vstest#15299) - \[main] Source code updates from dotnet/dotnet by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15293](microsoft/vstest#15293) - \[main] Source code updates from dotnet/dotnet by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15302](microsoft/vstest#15302) - \[main] Source code updates from dotnet/dotnet by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15314](microsoft/vstest#15314) - Delete sha1 custom implementation we are not using for a long time by [@​nohwnd](https://github.com/nohwnd) in [#​15313](microsoft/vstest#15313) - \[main] Source code updates from dotnet/dotnet by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15315](microsoft/vstest#15315) - Update branding to 18.3.0 by [@​nohwnd](https://github.com/nohwnd) in [#​15321](microsoft/vstest#15321) - \[main] Update dependencies from devdiv/DevDiv/vs-code-coverage by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15325](microsoft/vstest#15325) - \[main] Update dependencies from dotnet/arcade by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15264](microsoft/vstest#15264) - Revert adding dotnet\_host\_path workaround by [@​nohwnd](https://github.com/nohwnd) in [#​15328](microsoft/vstest#15328) - \[main] Update dependencies from dotnet/arcade by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15338](microsoft/vstest#15338) - \[main] Source code updates from dotnet/dotnet by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15322](microsoft/vstest#15322) - \[main] Update dependencies from dotnet/arcade by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15343](microsoft/vstest#15343) - Change PreReleaseVersionLabel from 'preview' to 'release' by [@​nohwnd](https://github.com/nohwnd) in [#​15352](microsoft/vstest#15352) - \[rel/18.3] Update dependencies from devdiv/DevDiv/vs-code-coverage by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15354](microsoft/vstest#15354) - \[rel/18.3] Update dependencies from dotnet/arcade by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15389](microsoft/vstest#15389) - \[rel/18.3] Update dependencies from dotnet/arcade by [@​dotnet-maestro](https://github.com/dotnet-maestro)\[bot] in [#​15400](microsoft/vstest#15400) - Update build tools to 17.11.48 to be source buildable by [@​nohwnd](https://github.com/nohwnd) in [#​15310](microsoft/vstest#15310) - Disable publishing on RTM by [@​nohwnd](https://github.com/nohwnd) in [#​15296](microsoft/vstest#15296) - Don't access nuget.org for package feeds by [@​nohwnd](https://github.com/nohwnd) in [#​15316](microsoft/vstest#15316) - No nuget access fix tests by [@​nohwnd](https://github.com/nohwnd) in [#​15317](microsoft/vstest#15317) - Disable Dependabot updates in dependabot.yml by [@​mmitche](https://github.com/mmitche) in [#​15324](https://github.com/microsoft/vstest/pull/15324) ##### New Contributors - [@​premun](https://github.com/premun) made their first contribution in [#​15291](microsoft/vstest#15291) ### [`v18.0.1`](https://github.com/microsoft/vstest/releases/tag/v18.0.1) ##### What's Changed Fixing an issue with loading covrun64.dll on systems that have .NET 10 SDK installed: <https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/code-coverage-dynamic-native-instrumentation> - Disable DynamicNative instrumentation by default by [@​nohwnd](https://github.com/nohwnd) in [#​15298](https://github.com/microsoft/vstest/pull/15298) - Update MicrosoftInternalCodeCoveragePackageVersion to 18.0.6 by [@​nohwnd](https://github.com/nohwnd) in [#​15312](https://github.com/microsoft/vstest/pull/15312) ##### Internal changes - Update VersionPrefix to 18.0.1 by [@​nohwnd](https://github.com/nohwnd) in [#​15301](https://github.com/microsoft/vstest/pull/15301) - Update build tools to 17.8.43 by [@​nohwnd](https://github.com/nohwnd) in [#​15305](https://github.com/microsoft/vstest/pull/15305) **Full Changelog**: <microsoft/vstest@v18.0.0...v18.0.1> ### [`v18.0.0`](https://github.com/microsoft/vstest/releases/tag/v18.0.0) ##### What's Changed - Update reporting formatting by [@​martincostello](https://github.com/martincostello) in [#​15082](https://github.com/microsoft/vstest/pull/15082) - Fix stack trace for Trace.Fail and Debug.Fail by [@​nohwnd](https://github.com/nohwnd) in [#​15103](https://github.com/microsoft/vstest/pull/15103) - Add documentation of environment variables by [@​Copilot](https://github.com/Copilot) in [#​15095](https://github.com/microsoft/vstest/pull/15095) - IFrameworkHandle.LaunchProcessWithDebuggerAttached allows null for workingDirectory in signature but throws by [@​Copilot](https://github.com/Copilot) in [#​15091](https://github.com/microsoft/vstest/pull/15091) - Add Dependabot configuration for .NET SDK updates by [@​JamieMagee](https://github.com/JamieMagee) in [#​15114](https://github.com/microsoft/vstest/pull/15114) - Handle dotnet\_root in testhost version aware way by [@​nohwnd](https://github.com/nohwnd) in [#​15184](https://github.com/microsoft/vstest/pull/15184) - Add magic bytes validation for Mach-O binaries in DotnetHostHelper by [@​Copilot](https://github.com/Copilot) in [#​15230](https://github.com/microsoft/vstest/pull/15230) - using globbing pattern doesn't work on windows with forward slashes by [@​Copilot](https://github.com/Copilot) in [#​15088](https://github.com/microsoft/vstest/pull/15088) - Remove tpv0 by [@​nohwnd](https://github.com/nohwnd) in [#​15247](https://github.com/microsoft/vstest/pull/15247) - Cache AssemblyName in ManagedNameHelper by [@​Youssef1313](https://github.com/Youssef1313) in [#​15259](https://github.com/microsoft/vstest/pull/15259) - Add ARM64 support to GetArchitectureForSource methods by [@​Copilot](https://github.com/Copilot) in [#​15278](https://github.com/microsoft/vstest/pull/15278) ##### Internal fixes and updates - Fix formatting in two files by [@​ViktorHofer](https://github.com/ViktorHofer) in [#​15047](https://github.com/microsoft/vstest/pull/15047) - Build TestPlatform packages in VMR by [@​ViktorHofer](https://github.com/ViktorHofer) in [#​15055](https://github.com/microsoft/vstest/pull/15055) - Condition property on .NET FX MSBuild by [@​jaredpar](https://github.com/jaredpar) in [#​15054](https://github.com/microsoft/vstest/pull/15054) - Migrate to awesome assertions by [@​nohwnd](https://github.com/nohwnd) in [#​15056](https://github.com/microsoft/vstest/pull/15056) - Revert "Build TestPlatform packages in VMR" by [@​ViktorHofer](https://github.com/ViktorHofer) in [#​15057](https://github.com/microsoft/vstest/pull/15057) - Update package Category by [@​ViktorHofer](https://github.com/ViktorHofer) in [#​15058](https://github.com/microsoft/vstest/pull/15058) - Revert "Write props of tests into trx" by [@​nohwnd](https://github.com/nohwnd) in [#​15080](https://github.com/microsoft/vstest/pull/15080) - Error on unsupported tfms ([#​15072](https://github.com/microsoft/vstest/issues/15072)) by [@​nohwnd](https://github.com/nohwnd) in [#​15073](https://github.com/microsoft/vstest/pull/15073) - Use policies from testfx to align by [@​nohwnd](https://github.com/nohwnd) in [#​15085](https://github.com/microsoft/vstest/pull/15085) - Update enable-auto-merge.yml by [@​nohwnd](https://github.com/nohwnd) in [#​15102](https://github.com/microsoft/vstest/pull/15102) - Revert ignoring environment test by [@​Copilot](https://github.com/Copilot) in [#​15094](https://github.com/microsoft/vstest/pull/15094) - unignore tests by [@​Copilot](https://github.com/Copilot) in [#​15093](https://github.com/microsoft/vstest/pull/15093) - Update MSTest by [@​Youssef1313](https://github.com/Youssef1313) in [#​15108](https://github.com/microsoft/vstest/pull/15108) - Bump dotnet-sdk from 9.0.106 to 9.0.301 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​15179](https://github.com/microsoft/vstest/pull/15179) - Use Assert.Equals by [@​nohwnd](https://github.com/nohwnd) in [#​15181](https://github.com/microsoft/vstest/pull/15181) - Run VSTest tests with MTP by [@​Youssef1313](https://github.com/Youssef1313) in [#​15079](https://github.com/microsoft/vstest/pull/15079) - Use the standard sdk for architecture switch test by [@​nohwnd](https://github.com/nohwnd) in [#​15188](https://github.com/microsoft/vstest/pull/15188) - Remove CUIT (Coded UI Test) from NuGet packages and test projects by [@​Copilot](https://github.com/Copilot) in [#​15177](https://github.com/microsoft/vstest/pull/15177) - dump-logs? by [@​nohwnd](https://github.com/nohwnd) in [#​15187](https://github.com/microsoft/vstest/pull/15187) - Moving to version 18 by [@​nohwnd](https://github.com/nohwnd) in [#​15209](https://github.com/microsoft/vstest/pull/15209) - Update fakes version by [@​drognanar](https://github.com/drognanar) in [#​15227](https://github.com/microsoft/vstest/pull/15227) - Microsoft.Intellitrace.Core should be taken from nuget by [@​nohwnd](https://github.com/nohwnd) in [#​15229](https://github.com/microsoft/vstest/pull/15229) - Remove MSTest.Assert.Extensions by [@​Youssef1313](https://github.com/Youssef1313) in [#​15178](https://github.com/microsoft/vstest/pull/15178) - Sourcebuild fix by [@​nohwnd](https://github.com/nohwnd) in [#​15239](https://github.com/microsoft/vstest/pull/15239) - Set dotnet\_root\_<arch> only when the architecture of dotnet in the path is the same by [@​nohwnd](https://github.com/nohwnd) in [#​15250](https://github.com/microsoft/vstest/pull/15250) - Remove fakes v1 from FakesUtilities by [@​drognanar](https://github.com/drognanar) in [#​15251](https://github.com/microsoft/vstest/pull/15251) - Update fakes dependencies by [@​drognanar](https://github.com/drognanar) in [#​15254](https://github.com/microsoft/vstest/pull/15254) - Do half the work in GetManagedName by [@​Youssef1313](https://github.com/Youssef1313) in [#​15255](https://github.com/microsoft/vstest/pull/15255) - check Vsix only when produced by [@​nohwnd](https://github.com/nohwnd) in [#​15261](https://github.com/microsoft/vstest/pull/15261) - Set dotnet\_root\_<arch> always by [@​nohwnd](https://github.com/nohwnd) in [#​15266](https://github.com/microsoft/vstest/pull/15266) - Don't hardcode old vswhere version in global.json by [@​akoeplinger](https://github.com/akoeplinger) in [#​15267](https://github.com/microsoft/vstest/pull/15267) - Revert dowgrade of fakes by [@​nohwnd](https://github.com/nohwnd) in [#​15263](https://github.com/microsoft/vstest/pull/15263) - Update VSSDK to version with code flow guard by [@​nohwnd](https://github.com/nohwnd) in [#​15279](https://github.com/microsoft/vstest/pull/15279) - Update Fakes to version with code flow guard by [@​nohwnd](https://github.com/nohwnd) in [#​15273](https://github.com/microsoft/vstest/pull/15273) - Add es-metadata.yml by [@​Youssef1313](https://github.com/Youssef1313) in [#​15276](https://github.com/microsoft/vstest/pull/15276) - Avoid iterator in TraitCollection.GetTraits by [@​Youssef1313](https://github.com/Youssef1313) in [#​15249](https://github.com/microsoft/vstest/pull/15249) - MSDia update by [@​nohwnd](https://github.com/nohwnd) in [#​15281](https://github.com/microsoft/vstest/pull/15281) - Use sdk.paths in global.json by [@​Youssef1313](https://github.com/Youssef1313) in [#​15258](https://github.com/microsoft/vstest/pull/15258) ##### New Contributors - [@​jaredpar](https://github.com/jaredpar) made their first contribution in [#​15054](https://github.com/microsoft/vstest/pull/15054) - [@​Copilot](https://github.com/Copilot) made their first contribution in [#​15094](https://github.com/microsoft/vstest/pull/15094) - [@​JamieMagee](https://github.com/JamieMagee) made their first contribution in [#​15114](https://github.com/microsoft/vstest/pull/15114) - [@​dependabot](https://github.com/dependabot)\[bot] made their first contribution in [#​15179](https://github.com/microsoft/vstest/pull/15179) **Full Changelog**: <microsoft/vstest@v17.14.1...v18.0.0> </details> --- ### Configuration 📅 **Schedule**: (in timezone Europe/Copenhagen) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC41MC4yIiwidXBkYXRlZEluVmVyIjoiNDQuNTAuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19--> Reviewed-on: https://git.ssy.dk/public/litty-logs-dotnet/pulls/6
Summary
Fix several obvious performance issues related to data types and redundant iterations across the codebase.
Changes
1. Dictionary
ContainsKey+ indexer →TryGetValueEliminates double hash lookups in ~15 locations. Each
ContainsKey+dict[key]pair performs two hash operations whenTryGetValuesuffices with one.Files changed:
ParallelRunDataAggregator.cs—GetAggregatedRunStats()TestSessionPool.cs—KillSession(),TryTakeProxy(),ReturnProxy()ProxyTestSessionManager.cs—DequeueProxy()InProcDataCollectionSink.cs—AddKeyValuePairToDictionary(),AddOrUpdateData()PortableSymbolReader.cs—GetNavigationData()FullSymbolReader.cs—GetTypeSymbol(),GetMethodSymbol()TestSessionStartArgs.cs—GetPropertyValue<T>()SessionEvents.cs—GetPropertyValue<T>()SimpleJSON.cs— indexer getter/setter,Add(),Remove()2.
Collection<InvokedDataCollector>→HashSet<InvokedDataCollector>ParallelRunDataAggregator.InvokedDataCollectorswas aCollection<T>with O(n).Contains()called inside aforeachloop (O(n²) behavior). Changed toHashSet<T>for O(1) lookups. The type already implementsIEquatable<T>andGetHashCode(). Updated call sites inParallelRunEventsHandlerandParallelDataCollectionEventsHandlerto wrap with.ToList()when passing to APIs expectingCollection<T>.3.
new[]allocation inside LINQ predicate → staticHashSetIn
EnableBlameArgumentProcessor.cs,new[] { "CollectAlways", "DumpType" }was allocated per element inside.Where()predicates. Extracted to file-scoped staticHashSet<string>fields withStringComparer.OrdinalIgnoreCase.4. String
+=→ string interpolationConsolidated two sequential
options +=calls into a single interpolated string inTestRunnerConnectionInfoExtensions.cs.Testing
build.cmd -c Release— 0 errors, 0 warningsParallelRunDataAggregatortests: ✅ 44 passedTestSessionPooltests: ✅ 8 passedInProcDataCollectiontests: ✅ 30 passedEnableBlametests: ✅ 26 passed