Perf: Fix a bottleneck in calculate_hashes
#41
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 profiling Floresta I found that
calculate_hashes
, a method used for computing roots from a proof, was taking an absurd amount of time in one specific function calledsorted_push
. As the name implies, this function adds an element to a collection, and keeps the full collection sorted. The approach used was simply to push and then sort the array. But the successive calls to merge-sort caused a severe performance hit for large proofs.This PR uses an elementary replacement for this function. We keep the invariant of sorting by appending the element right where it should be, if we want to keep the whole collection sorted. We find this element by performing a binary search over the collection.
For reference, I wrote a small doc with different approaches that could be taken. The mentioned profiling is this flamegraph. Here's how it looks like after this change. This pr also adds a benchmark for this method. Here's the result before and after it.