Reduce performance overhead of map lookups in Invoker.invoked() #202
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.
Invoker.invoked()
is showing up as a performance hotspot in my tests. For full details of my investigation, see #201.In my profiling, half of the time in
Invoker.invoked()
was spent computing hashCodes when indexing into theids
map, which is aThreadSafeMap[(String, Int), Any]
. This PR replaces the single-level map by a two-levelThreadSafeMap[String, ThreadSafeMap[Int, Any]]
map. This isn't much more space because theString
part of the key is usually constant and it's not a whole lot of extra lookup time either because the outer map typically has at most one element.After making this change I no longer saw map lookups as a bottleneck; instead, all of the time shifted to
flush()
calls (which I plan to address in a separate PR; see discussion at #201).I also made a small micro-optimization to avoid unnecessary int boxing and implicit
StringBuilder
construction.