On Fri, 8 Sep 2023 18:17:12 GMT, 温绍锦 <d...@openjdk.org> wrote: >> 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.testLargeToEngineeringStr... > > 温绍锦 has updated the pull request incrementally with one additional commit > since the last revision: > > bug fix & add testcases
The new 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 * baseline https://github.com/wenshao/jdk/tree/baseline_test * optimize version : 09 [Full](https://webrevs.openjdk.org/?repo=jdk&pr=15555&range=09) - [Incremental](https://webrevs.openjdk.org/?repo=jdk&pr=15555&range=08-09) ([c4425ddd](https://git.openjdk.org/jdk/pull/15555/files/c4425dddef7dbb9e6ee0851fde8561869bf0ddd5)) ## 3. benchmark result ## 3.1. [aliyun_ecs_c8i.xlarge](https://help.aliyun.com/document_detail/25378.html#c8i) * cpu : intel xeon sapphire rapids (x64) * os : Alibaba Cloud Linux 3.2104 LTS 64 -Benchmark Mode Cnt Score Error Units (baseline) -BigDecimals.testHugeToPlainString avgt 15 188.687 ? 0.210 ns/op -BigDecimals.testLargeToPlainString avgt 15 36.547 ? 0.083 ns/op -BigDecimals.testSmallToPlainString avgt 15 34.270 ? 0.075 ns/op -BigDecimals.testToPlainString avgt 15 1661.588 ? 25.568 ns/op +Benchmark Mode Cnt Score Error Units (optimized) +BigDecimals.testHugeToPlainString avgt 15 117.868 ? 0.390 ns/op (+60.08%) +BigDecimals.testLargeToPlainString avgt 15 15.903 ? 0.069 ns/op (+129.81%) +BigDecimals.testSmallToPlainString avgt 15 13.502 ? 0.051 ns/op (+153.81%) +BigDecimals.testToPlainString avgt 15 1556.691 ? 19.407 ns/op (+6.73%) -Benchmark Mode Cnt Score Error Units (baseline) -BigDecimals.testHugeToEngineeringString avgt 15 207.858 ? 4.166 ns/op -BigDecimals.testLargeToEngineeringString avgt 15 35.723 ? 2.772 ns/op -BigDecimals.testSmallToEngineeringString avgt 15 15.083 ? 0.052 ns/op -BigDecimals.testToEngineeringString avgt 15 1715.916 ? 37.066 ns/op +Benchmark Mode Cnt Score Error Units (optimized) +BigDecimals.testHugeToEngineeringString avgt 15 142.110 ? 0.987 ns/op (+46.26%) +BigDecimals.testLargeToEngineeringString avgt 15 12.509 ? 0.056 ns/op (+185.57%) +BigDecimals.testSmallToEngineeringString avgt 15 10.579 ? 0.066 ns/op (+42.57%) +BigDecimals.testToEngineeringString avgt 15 1646.783 ? 3.060 ns/op (+4.19%) ## 3.2. [aliyun_ecs_c8a.xlarge](https://help.aliyun.com/document_detail/25378.html#c8a) * cpu : amd epc genoa (x64) * os : Alibaba Cloud Linux 3.2104 LTS 64 -Benchmark Mode Cnt Score Error Units (baseline) -BigDecimals.testHugeToEngineeringString avgt 15 300.712 ? 8.526 ns/op -BigDecimals.testLargeToEngineeringString avgt 15 42.108 ? 0.149 ns/op -BigDecimals.testSmallToEngineeringString avgt 15 24.333 ? 0.076 ns/op -BigDecimals.testToEngineeringString avgt 15 2300.080 ? 12.640 ns/op +Benchmark Mode Cnt Score Error Units (optimized) +BigDecimals.testHugeToEngineeringString avgt 15 161.471 ? 1.303 ns/op (+86.23%) +BigDecimals.testLargeToEngineeringString avgt 15 24.847 ? 0.111 ns/op (+69.46%) +BigDecimals.testSmallToEngineeringString avgt 15 21.529 ? 0.088 ns/op (+13.02%) +BigDecimals.testToEngineeringString avgt 15 2016.281 ? 21.728 ns/op (+14.07%) -Benchmark Mode Cnt Score Error Units (baseline) -BigDecimals.testHugeToPlainString avgt 15 277.892 ? 1.485 ns/op -BigDecimals.testLargeToPlainString avgt 15 42.669 ? 0.075 ns/op -BigDecimals.testSmallToPlainString avgt 15 38.928 ? 0.402 ns/op -BigDecimals.testToPlainString avgt 15 2245.593 ? 20.488 ns/op +Benchmark Mode Cnt Score Error Units (optimized) +BigDecimals.testHugeToPlainString avgt 15 154.470 ? 7.259 ns/op (+79.90%) +BigDecimals.testLargeToPlainString avgt 15 29.892 ? 0.290 ns/op (+42.74%) +BigDecimals.testSmallToPlainString avgt 15 25.605 ? 0.109 ns/op (+52.03%) +BigDecimals.testToPlainString avgt 15 2027.892 ? 12.792 ns/op (+10.73%) ## MaxBookPro M1 Pro -Benchmark Mode Cnt Score Error Units (baseline) -BigDecimals.testHugeToEngineeringString avgt 15 250.340 ? 4.911 ns/op -BigDecimals.testLargeToEngineeringString avgt 15 83.954 ? 7.603 ns/op -BigDecimals.testSmallToEngineeringString avgt 15 17.321 ? 0.083 ns/op -BigDecimals.testToEngineeringString avgt 15 1874.298 ? 71.820 ns/op +Benchmark Mode Cnt Score Error Units (optimized) +BigDecimals.testHugeToEngineeringString avgt 15 104.412 ? 17.752 ns/op (+139.76%) +BigDecimals.testLargeToEngineeringString avgt 15 14.617 ? 0.380 ns/op (+474.35%) +BigDecimals.testSmallToEngineeringString avgt 15 11.960 ? 0.021 ns/op (+44.82%) +BigDecimals.testToEngineeringString avgt 15 1622.669 ? 81.835 ns/op (+15.50%) -Benchmark Mode Cnt Score Error Units (baseline) -BigDecimals.testHugeToPlainString avgt 15 188.559 ? 9.283 ns/op -BigDecimals.testLargeToPlainString avgt 15 22.894 ? 0.102 ns/op -BigDecimals.testSmallToPlainString avgt 15 24.029 ? 0.164 ns/op -BigDecimals.testToPlainString avgt 15 1858.483 ? 56.941 ns/op +Benchmark Mode Cnt Score Error Units (optimized) +BigDecimals.testHugeToPlainString avgt 15 87.264 ? 0.677 ns/op (+116.07%) +BigDecimals.testLargeToPlainString avgt 15 16.665 ? 0.045 ns/op (+37.37%) +BigDecimals.testSmallToPlainString avgt 15 13.467 ? 0.091 ns/op (+78.42%) +BigDecimals.testToPlainString avgt 15 1593.317 ? 84.553 ns/op (+16.64%) ------------- PR Comment: https://git.openjdk.org/jdk/pull/15555#issuecomment-1712096597