RFR: 8315585: Optimization for decimal to string [v10]

温绍锦 duke at openjdk.org
Fri Sep 8 18:57:41 UTC 2023


On Fri, 8 Sep 2023 18:17:12 GMT, 温绍锦 <duke at 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


More information about the core-libs-dev mailing list