Use WeakMap for caching #51
Closed
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.
In a Twitter conversation https://twitter.com/webreflection raised the point that template literal statics are cached. They're cached by call site, which makes them ideal for this purpose. Combining this with WeakMaps (which are also supported in IE 11) allows fast caching while avoiding cache retention of unnecessary templates.
This pull request first modifies the benchmarks to use tagged template literals whenever possible to match the most common usage pattern. After that it switches to WeakMap based caching.
The code size goes down, and the "usage" benchmark numbers improve:
Before change
After change
When I ran the benchmarks without Jest the difference in the "usage" benchmark was even more pronounced:
Before change
After change
In the thread there was a suggestion to fall back to Map if WeakMaps aren't present. I didn't implement that, because all platforms (with the exception es6-shim) support WeakMap if they support Map.
The drawback in this approach is that the library now requires WeakMap. However, it appears that platforms that don't support WeakMap natively also don't support tagged templates natively.