jdk
jdk copied to clipboard
8331907: BigInteger and BigDecimal should use optimized division
Replace the custom unsigned divide / remainder functions with the compiler-optimized Long.divideUnsigned / remainderUnsigned.
No new tests. Existing tier1-3 tests continue to pass.
I added a new set of divide benchmarks. Results in thread.
I also removed the BigDecimal.toString benchmarks. They no longer serve their purpose - toString caches the returned value, so we were only benchmarking the cache access time.
Progress
- [x] Change must be properly reviewed (1 review required, with at least 1 Reviewer)
- [x] Change must not contain extraneous whitespace
- [x] Commit message must refer to an issue
Issue
- JDK-8331907: BigInteger and BigDecimal should use optimized division (Enhancement - P4)
Reviewers
- Raffaello Giulietti (@rgiulietti - Reviewer)
- Brian Burkhalter (@bplb - Reviewer)
Reviewing
Using git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/19134/head:pull/19134
$ git checkout pull/19134
Update a local copy of the PR:
$ git checkout pull/19134
$ git pull https://git.openjdk.org/jdk.git pull/19134/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 19134
View PR using the GUI difftool:
$ git pr show -t 19134
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/19134.diff
Webrev
:wave: Welcome back djelinski! A progress list of the required criteria for merging this PR into master
will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.
@djelinski This change now passes all automated pre-integration checks.
ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details.
After integration, the commit message for the final commit will be:
8331907: BigInteger and BigDecimal should use optimized division
Reviewed-by: rgiulietti, bpb
You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed.
At the time when this comment was updated there had been 79 new commits pushed to the master
branch:
- 5ded8da676d62158d0011086d7f80ff2c9096e13: 8332085: Remove 10 year old transition check in GenerateCurrencyData tool
- 7c2c24fc0511b36132952c96be46eea5904a53c5: 8261433: Better pkcs11 performance for libpkcs11:C_EncryptInit/libpkcs11:C_DecryptInit
- ff4bf1cf9f18547cff8f484433c3c55b4c288aaa: 8332102: Add
@since
to package-info ofjdk.security.jarsigner
- abf54bb1e6da6d7bc432b3e9bb3ff164a895bd3e: 8332100: Add missing
@since
to KeyValue::EC_TYPE injava.xml.crypto
- 1484153c1a092cefc20270b35aa1e508280843a4: 8332080: Update troff man page for javadoc
- 391bbbc7d0fb95b0cd55e2f56c43bee019aeab7f: 8330584: IGV: XML does not save all node properties
- adaa509b6ed3d12569b8e5f2ec802cef22ab53c7: 8327499: MethodHandleStatics.traceLambdaForm includes methods that cannot be generated
- 5a8df4106ac5386eb72e874dcadf2b18defe27d8: 8331535: Incorrect prompt for Console.readLine
- 3e3f7cf4bddf243fddfeac8cfc1d9b2a1be55043: 8330387: Crash with a different types patterns (primitive vs generic) in instanceof
- d517d2df451e135583083ed3684d7d3241b36f76: 8331764: C2 SuperWord: refactor _align_to_ref/_mem_ref_for_main_loop_alignment
- ... and 69 more: https://git.openjdk.org/jdk/compare/a8b3f194e811eed6b20bce71c752705c7cd50d24...master
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details.
➡️ To integrate this PR with the above commit message to the master
branch, type /integrate in a new comment.
@djelinski The following label will be automatically applied to this pull request:
-
core-libs
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command.
Results before:
Benchmark Mode Cnt Score Error Units
BigDecimals.testHugeLargeDivide avgt 15 115.176 ± 0.965 ns/op
BigDecimals.testHugeSmallDivide avgt 15 82.652 ± 0.601 ns/op
BigDecimals.testLargeSmallDivide avgt 15 6.601 ± 0.320 ns/op
BigIntegers.testHugeLargeDivide avgt 15 53.905 ± 0.734 ns/op
BigIntegers.testHugeSmallDivide avgt 15 52.762 ± 0.354 ns/op
BigIntegers.testLargeSmallDivide avgt 15 22.990 ± 0.058 ns/op
after:
Benchmark Mode Cnt Score Error Units
BigDecimals.testHugeLargeDivide avgt 15 106.549 ± 0.695 ns/op
BigDecimals.testHugeSmallDivide avgt 15 68.339 ± 0.172 ns/op
BigDecimals.testLargeSmallDivide avgt 15 6.594 ± 0.328 ns/op
BigIntegers.testHugeLargeDivide avgt 15 29.576 ± 0.411 ns/op
BigIntegers.testHugeSmallDivide avgt 15 30.072 ± 0.242 ns/op
BigIntegers.testLargeSmallDivide avgt 15 8.034 ± 0.078 ns/op
Webrevs
- 03: Full - Incremental (ec680946)
- 02: Full - Incremental (83a9959a)
- 01: Full - Incremental (a3fbc07d)
- 00: Full (e565e1b6)
There's another spot for replacement at L.1096-1097 in MutableBigInteger
. Did you see that one?
L.1096-1097 is a 32-bit by 32-bit division; I guess I could change it to use Integer.unsignedDivide. Let me look into it...
Thanks for the reviews!
/integrate
Going to push as commit beea5305b071820e2b128a55c5ca384caf470fdd.
Since your change was applied there have been 80 commits pushed to the master
branch:
- 440782e0160f867f08afbec0abf48d557a522c72: 8331466: Problemlist serviceability/dcmd/gc/RunFinalizationTest.java on generic-all
- 5ded8da676d62158d0011086d7f80ff2c9096e13: 8332085: Remove 10 year old transition check in GenerateCurrencyData tool
- 7c2c24fc0511b36132952c96be46eea5904a53c5: 8261433: Better pkcs11 performance for libpkcs11:C_EncryptInit/libpkcs11:C_DecryptInit
- ff4bf1cf9f18547cff8f484433c3c55b4c288aaa: 8332102: Add
@since
to package-info ofjdk.security.jarsigner
- abf54bb1e6da6d7bc432b3e9bb3ff164a895bd3e: 8332100: Add missing
@since
to KeyValue::EC_TYPE injava.xml.crypto
- 1484153c1a092cefc20270b35aa1e508280843a4: 8332080: Update troff man page for javadoc
- 391bbbc7d0fb95b0cd55e2f56c43bee019aeab7f: 8330584: IGV: XML does not save all node properties
- adaa509b6ed3d12569b8e5f2ec802cef22ab53c7: 8327499: MethodHandleStatics.traceLambdaForm includes methods that cannot be generated
- 5a8df4106ac5386eb72e874dcadf2b18defe27d8: 8331535: Incorrect prompt for Console.readLine
- 3e3f7cf4bddf243fddfeac8cfc1d9b2a1be55043: 8330387: Crash with a different types patterns (primitive vs generic) in instanceof
- ... and 70 more: https://git.openjdk.org/jdk/compare/a8b3f194e811eed6b20bce71c752705c7cd50d24...master
Your commit was automatically rebased without conflicts.
@djelinski Pushed as commit beea5305b071820e2b128a55c5ca384caf470fdd.
:bulb: You may see a message that your pull request was closed with unmerged commits. This can be safely ignored.