> BigDecimal is a commonly used class in business development, It is often > necessary to perform toString or toPlainString operations on BigDecimal. > > The current version uses StringBuilder resulting in multiple memory > allocations, I made a modification to improve performance. > > Because BigDecimal uses stringCache to cache the result of toString, the > performance of toString needs special treatment before testing, such as > clearing stringCache by unsafe operation before each test, The performance of > toString is similar to that of toEngineering. > > The performance data is as follows: > > ## 1. benchmark script > > sh make/devkit/createJMHBundle.sh > bash configure --with-jmh=build/jmh/jars > make test TEST="micro:java.math.BigDecimals.*ToPlainString" > make test TEST="micro:java.math.BigDecimals.*ToEngineering" > > > ## 2. benchmark environment > * virtual machine : > [aliyun_ecs_c8i.xlarge](https://help.aliyun.com/zh/ecs/user-guide/overview-of-instance-families#c8i) > * cpu intel xeon sapphire rapids (x64) > > ## 3. benchmark result > > -BigDecimals.testHugeToPlainString avgt 15 188.691 ± 0.822 > ns/op (baseline) > -BigDecimals.testLargeToPlainString avgt 15 36.656 ± 0.065 ns/op > -BigDecimals.testSmallToPlainString avgt 15 34.342 ± 0.068 ns/op > -BigDecimals.testToPlainString avgt 15 1719.494 ± 24.886 ns/op > > +Benchmark Mode Cnt Score Error > Units (optimize) > +BigDecimals.testHugeToPlainString avgt 15 133.972 ? 0.328 > ns/op (+40.84%) > +BigDecimals.testLargeToPlainString avgt 15 14.957 ? 0.047 > ns/op (145.07%) > +BigDecimals.testSmallToPlainString avgt 15 12.045 ? 0.036 > ns/op (+185.11) > +BigDecimals.testToPlainString avgt 15 1643.500 ? 3.217 > ns/op (+4.62%) > > -Benchmark Mode Cnt Score Error > Units (baseline) > -BigDecimals.testHugeToEngineeringString avgt 15 207.621 ± 5.018 ns/op > -BigDecimals.testLargeToEngineeringString avgt 15 35.658 ± 3.144 ns/op > -BigDecimals.testSmallToEngineeringString avgt 15 15.142 ± 0.053 ns/op > -BigDecimals.testToEngineeringString avgt 15 1813.959 ± 12.842 ns/op > > +Benchmark Mode Cnt Score Error > Units (optimize) > +BigDecimals.testHugeToEngineeringString avgt 15 142.110 ? 0.987 > ns/op (+45.09%) > +BigDecimals.testLargeToEngineeringString avgt 15 12.509 ? 0.056 > ns/op (+185.05%) > +BigDecimals.testSmallToEngineer...
温绍锦 has updated the pull request incrementally with one additional commit since the last revision: BigInteger use a separate jla ------------- Changes: - all: https://git.openjdk.org/jdk/pull/15555/files - new: https://git.openjdk.org/jdk/pull/15555/files/9846ff90..97e4f7db Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=15555&range=01 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=15555&range=00-01 Stats: 7 lines in 2 files changed: 4 ins; 0 del; 3 mod Patch: https://git.openjdk.org/jdk/pull/15555.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/15555/head:pull/15555 PR: https://git.openjdk.org/jdk/pull/15555