-
Notifications
You must be signed in to change notification settings - Fork 114
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allocation cleanup #508
Allocation cleanup #508
Conversation
@avanigupta @zhiyuanliang-ms @zhenlan This is blocking v4 release If you have time to review! |
@@ -1976,4 +1976,51 @@ public async Task CustomIFeatureDefinitionProvider() | |||
Assert.True(called); | |||
} | |||
} | |||
|
|||
public class PerformanceTests |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we use the tool like benchmark .net to verifiy this change can improve the performance?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we create an issue to track this? It doesn't need to block v4 release.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Created issue: #512
In the meantime- I created a repo to run BenchmarkDotNet tests against multiple versions of this library. Here's a link to the results/repo (Same results as the screenshot shared in another comment): https://github.com/rossgrambo/FeatureManagementBenchmark/blob/main/BenchmarkDotNet.Artifacts/results/FeatureManagementBenchmark.Benchmarks-report-github.md
@rossgrambo Could please explain why storing task in the dictionary can save memory? |
The single line that caused a developer to write in was:
The problem with this function is that the lambda/delegate/func syntax of:
Creates a Func. Although it's not called in the case we hit the cache- it still allocates memory for the func every time this line is hit. This is because it happens before the This line also uses |
src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs
Outdated
Show resolved
Hide resolved
src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs
Outdated
Show resolved
Hide resolved
Discussed offline with @rossgrambo, this PR looks good to me. |
Why this PR?
We noticed we were allocating a lot of memory in v4 compared to v3. This PR resolves many instances of extra allocations or memory and resolves some issues that existed in v3 as well.
Now- the allocations are just the EvaluationEvent object (which could be improved more for the boolean and missing defintion case), async closures, and enumerators only when needed.
Additionally-
Visible Changes
No changes are visible to developers using the library. They may notice allocation wins.