Asamm/matching cache improvements #1369
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.
After a lot of tests and benchmarks, where usually performance difference was close to 0, this change makes a major impact!
1. Change in
MatchingCacheKeyobjectThe current key object has a few disadvantages
All this is solved by the
RenderTheme.computeMatchingCacheKeymethod, which directly computes theIntegerbased key from necessary parameters without creating any extra object.2. Increase cache size
This one is a game-changer. The current "way/poi -matchingCache" cache limited to 1024 causes a very often removal and re-adding of many identical items, just because of its size.
My recommended value is 8192. The biggest themes I've tested have around 5 - 6k of cached items in zoom level 12. An increase in the cache size causes a reduction of
matchNodeandmatchWaycalls to 10%! Almost no garbage collector calls and amazing performance gain (together with optimization no 1.).I've also converted cached instructions to
RenderInstruction[](from List) to save a few bytes in memory.Result
Comparing to the current! master branch performance (so already a little improved), this change brings another reduction of rendering time to 78% (so it is 66% compared to the original code before any optimizations).
With the current devices, 8192 is no problem in terms of memory. I also use a very similar setup in the Locus Map for years!