> 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 with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 14 additional commits since the last revision: - Merge branch 'master' into optimization_for_decimal_to_string - fix scale 19 error & add testcases - bug fix & add testcases - remove jla.newStringLatin1NoRepl - rename jla.digit to digitPair - fix adjusted >= Integer.MAX_VALUE - Continue to optimize and reduce duplicate code - Merge branch 'master' into optimization_for_decimal_to_string_2 - add testcase & bug fix - Merge branch 'master' into optimization_for_decimal_to_string - ... and 4 more: https://git.openjdk.org/jdk/compare/af39d8d4...33f8688d ------------- Changes: - all: https://git.openjdk.org/jdk/pull/15555/files - new: https://git.openjdk.org/jdk/pull/15555/files/562869d5..33f8688d Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=15555&range=11 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=15555&range=10-11 Stats: 8635 lines in 272 files changed: 3793 ins; 4418 del; 424 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