perf: Add invariant culture check result caching #376
Merged
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.
Every time SqlConnection.TryOpen is called the culture is checked to see if the runtime is in invariant mode and then throws because we can't run under culture invariant conditions. The culture object itself is cached so the check isn't too slow but in getting the cached object a string is allocated inside the runtime that can't be avoided. We can avoid most of this by caching the result of the first check because there is no way to change the invariant mode without restarting the runtime.
The enum is uint because it's the fastest comparison for the runtime. The assignment back to the static cached value isn't interlocked and it isn't really necessary to do so because if a small number of opens happen at the same time the last assigner will win and all assigners will get the same value so nothing is confused or lost it'll just exhibit the same performance as the current master would.