Stop using anonymous functions in ResolverUtility.FindLibraryByVersionAsync to reduce memory allocations #4348
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.
Bug
Fixes: NuGet/Home#11409
Regression? Last working version:
Description
I added a few details about the memory allocations in the linked issue. After reading Use local function instead of lambda (IDE0039) doc and https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/local-functions#heap-allocations, I modified the code path to use local function instead of lambda expressions. The reason I chose
static local function
is because ofIf you know that your local function won't be converted to a delegate and none of the variables captured by it are captured by other lambdas or local functions that are converted to delegates, you can guarantee that your local function avoids being allocated on the heap by declaring it as a static local function. Note that this feature is available in C# 8.0 and newer.
in the doc.This method has ~880 MB allocations during solution restore for OrchardCore solution https://github.com/OrchardCMS/OrchardCore/tree/75923732c36d2785cb869affb805f0ff19d1847c
After code modifications the heap allocations of ResolverUtility.FindLibraryByVersionAsync method have reduced by ~200 MB. for the same solution.
PR Checklist
PR has a meaningful title
PR has a linked issue.
Described changes
Tests
Documentation