Cache whether a type is a collection - #1890
Merged
Merged
Conversation
Whether a value is a collection depends only on its type, but it was recomputed per value. With the default ignoreEmptyCollections this runs for every non null member value, array item and dictionary value, and anything that is not a non generic ICollection (every HashSet, dictionary key and value view, iterator, LINQ result and immutable collection) allocated a fresh Type[] from GetInterfaces and then made several LINQ passes over it with FullName string comparisons, for every occurrence of the same type. The classification is now held in a ConcurrentDictionary keyed by type, leaving only the per value IsEmpty enumeration. The added test cases all sit below the ICollection fast path, so they exercise the classification, and they pass unchanged against the previous implementation.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Whether a value is a collection depends only on its type, but it was recomputed per value. With the default ignoreEmptyCollections this runs for every non null member value, array item and dictionary value, and anything that is not a non generic ICollection (every HashSet, dictionary key and value view, iterator, LINQ result and immutable collection) allocated a fresh Type[] from GetInterfaces and then made several LINQ passes over it with FullName string comparisons, for every occurrence of the same type.
The classification is now held in a ConcurrentDictionary keyed by type, leaving only the per value IsEmpty enumeration.
The added test cases all sit below the ICollection fast path, so they exercise the classification, and they pass unchanged against the previous implementation.