64-bit integer arithmetic performance optimization #1082
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.
This PR has two changes aimed on improving math performance under GopherJS:
Optimized 64-bit int multiplication algorithm, ~15x faster than the original one. It is still orders of magnitude slower than native 64-bit operations on a modern CPU, but it improves
crypto/ed25519
performance quite a bit.I think there is some potential for further improvement in adopting JavaScript's
BigInt
for 64-bit math, but browser support for it is far from universal, and it will require significant changes to the compilerRemoved use of 64-bit ints in
math/bits
package where possible. This also improved performance ofAdd32
,Mul32
,Div32
, etc. functions by 10-20x. This had improved performance of asymmetric crypto packages, such ascrypto/rsa
:Some more specific benchmarks are available in commit comments. Overall this reduced standard library tests execution time on CI from 14 to 7 minutes, which was my main motivation :)