fix: More reliably cache NameAccumulator
modexps
#326
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.
BigUint::modexp
operations take up to 14ms in Wasm on my machine, and it's the core operation forNameAccumulator
s.This introduces a LRU cache inside
HamtForest
that cachesNameAccumulator
operations.This is much more reliable than sprinkling
OnceCell
s every here and there, sinceOnceCell
caches depends on the lifetime of the object they're contained in, and it's harder to make these structs longer-lived in some cases.OnceCell
s are contained inside are mutable via&mut self
operations. We need to remember to always empty theseOnceCell
s when that happens. This is bad for two reasons: (1) we might forget doing so sometimes, keeping stale, incorrectly cached data around and (2) even though the cache doesn't match the object anymore, it may still be a useful cache!