Add microbenchmarks, improve RangeMap perf #49
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.
This adds microbenchmarks to analyze the performance of several parts of Deopt Explorer and improves the performance of
RangeMap
, which is used throughout the extension to collection information related to positions and ranges, such as for producing hovers.The key changes were to support a user-defined comparer in
SplayTree
, which allowedRangeMap
to switch from using series of nestedSplayTree
s that mapstartLine -> startCharacter -> endLine -> endCharacter -> T
to a singleSplayTree
whose keys areRange
s using a custom comparer. The ranges are sorted byrange.start
in ascending order, thenrange.end
in descending order. This order allows us to treat subsequent ranges as if they were contained by prior ranges as long as they share the same start position, which results in more efficient traversal.This also adds linked list-like pointers to
SplayTree.Node
to make in-order traversal more efficient and reliable.The net result is a 40x improvement in calls to
.findAllContaining()
: