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