Suggested perf improvements in DataFlowAnalysis #50310
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I have a few suggested performance improvements in
DataFlowAnalysis
:.Any()
call onPooledSortedSet<T>
isEnumerable.Any
extension method call, that type does not have its ownAny
method like some types do, e.g.ArrayBuilder<T>
. AsEnumerable.Any
performs type checks, it should be better to check.Count
.I believe there's a standard CA1860 rule for those kind of cases. As it's included in
Minimum
analysis mode, I also prepared PR Use AnalysisMode=minimum in Microsoft.CodeAnalysis.NetAnalyzers and fix errors (perf rules) #50367 to start catching these errors.There are a few issues with the part of code in
RunCore
method:.Where
allocating an enumerable.Where
creates closure.Where
is enumerated multiple times.I'd suggest to re-write that part with a simple loop to avoid these issues.
Regarding multiple enumeration, there's a standard CA1851 rule, I believe it was added in .NET 7.
The delegate passed to
.Any
call inHasUnprocessedPredecessorBlock
also creates closure.