Skip to content

Comments

Small allocation optimization to SyntaxFacts.HasYieldOperations#82491

Closed
ToddGrun wants to merge 1 commit intodotnet:mainfrom
ToddGrun:dev/toddgrun/HasYieldOperationsAllocations
Closed

Small allocation optimization to SyntaxFacts.HasYieldOperations#82491
ToddGrun wants to merge 1 commit intodotnet:mainfrom
ToddGrun:dev/toddgrun/HasYieldOperationsAllocations

Conversation

@ToddGrun
Copy link
Contributor

In draft mode until speedometer results come back.

LightBulbInvocationTestForCsharp speedometer test shows about 2.2 MB (0.2%) of allocations in VS during it's scenarios as pooled array allocations / resizes in this method. The method being tested is fairly large, and ends up causing the ArrayBuilder instances to exceed the pooled maximum size. Instead of adding items to the array to be tested in this method, instead add enumerators to the array and walk those.

image

LightBulbInvocationTestForCsharp speedometer test shows about 2.2 MB (0.2%) of allocations in VS during it's scenarios as pooled array allocations / resizes in this method. The method being tested is fairly large, and ends up causing the ArrayBuilder instances to exceed the pooled maximum size. Instead of adding items to the array to be tested in this method, instead add enumerators to the array and walk those.
@ToddGrun
Copy link
Contributor Author

/pr-val

@github-actions
Copy link
Contributor

View PR Validation Run triggered by @ToddGrun

Parameters
  • Validation Type: pr-val
  • Pipeline ID: 8972
  • Pipeline Version: main
  • PR Number: 82491
  • Commit SHA: 812e66b8c61105397babb9fe5cb438a3b9bef797
  • Source Branch: dev/toddgrun/HasYieldOperationsAllocations
  • Target Branch: main
  • Build ID: 13366962

@ToddGrun
Copy link
Contributor Author

Bummer. Speedometer results came back actually worse than the original. Looked at the exact form of the document being edited by the speedometer and tested against it locally (200 methods in the file). What ends up happening a highly parallel call into HasYieldOperations, such that the Free calls end up trampling over each other in ObjectPool.(Free/FreeSlow). Lock free pooling ends up causing object loss with this high of contention, and because I've increased the size of each entry in the array, the total allocated loss is greater with this change.

Going to abandon, as I can't think of a nice way around this. :(

@ToddGrun ToddGrun closed this Feb 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant