RFR: 8315585: Optimization for decimal to string

Shaojin Wen swen at openjdk.org
Tue Jan 28 08:12:29 UTC 2025


On Sat, 25 Jan 2025 07:25:40 GMT, Shaojin Wen <swen at openjdk.org> wrote:

> Continue to complete PR #16006 and PR #21593 to improve BigDecimal::toString and BigDecimal::toPlainString performance and reduce duplicate code

The performance numbers as follows. In the smallScale2EngineeringToString and smallScale2LayoutCharsToString scenarios, the performance is the same as before, but there are very significant performance improvements in other scenarios.


## 1. Script

git remote add wenshao git at github.com:wenshao/jdk.git
git fetch wenshao

#baseline
git checkout 4040d766e9cecf781be1d790e5e7836368acc7bd
make test TEST="micro:java.math.BigDecimals.huge"
make test TEST="micro:java.math.BigDecimals.large"
make test TEST="micro:java.math.BigDecimals.small"

# current
git checkout cb88e0efe6cc3e241b49951b076dccb1c690f7cb
make test TEST="micro:java.math.BigDecimals.huge"
make test TEST="micro:java.math.BigDecimals.large"
make test TEST="micro:java.math.BigDecimals.small"



## 2. aliyun_ecs_c8a_x64 (CPU AMD EPYC™ Genoa)

-# baseline
-Benchmark                                   Mode  Cnt     Score   Error  Units (4040d766e9c)
-BigDecimals.hugeEngineeringToString         avgt   15   170.621 ± 0.834  ns/op
-BigDecimals.hugeLayoutCharsToString         avgt   15   169.597 ± 0.373  ns/op
-BigDecimals.hugePlainToString               avgt   15   156.598 ± 1.141  ns/op
-BigDecimals.largeScale2EngineeringToString  avgt   15    34.733 ± 2.767  ns/op
-BigDecimals.largeScale2LayoutCharsToString  avgt   15    33.044 ± 0.153  ns/op
-BigDecimals.largeScale2PlainToString        avgt   15    30.302 ± 0.042  ns/op
-BigDecimals.largeScale3EngineeringToString  avgt   15    39.054 ± 0.084  ns/op
-BigDecimals.largeScale3LayoutCharsToString  avgt   15    39.180 ± 0.065  ns/op
-BigDecimals.largeScale3PlainToString        avgt   15    31.261 ± 0.081  ns/op
-BigDecimals.smallScale2EngineeringToString  avgt   15    11.364 ± 0.019  ns/op
-BigDecimals.smallScale2LayoutCharsToString  avgt   15    11.387 ± 0.038  ns/op
-BigDecimals.smallScale2PlainToString        avgt   15    29.513 ± 0.045  ns/op
-BigDecimals.smallScale3EngineeringToString  avgt   15    33.208 ± 0.166  ns/op
-BigDecimals.smallScale3LayoutCharsToString  avgt   15    33.171 ± 0.084  ns/op
-BigDecimals.smallScale3PlainToString        avgt   15    28.995 ± 0.037  ns/op


+# current
+Benchmark                                   Mode  Cnt     Score    Error  Units (cb88e0efe6c)
+BigDecimals.hugeEngineeringToString         avgt   15   158.130 ±  2.980  ns/op
+BigDecimals.hugeLayoutCharsToString         avgt   15   156.163 ±  0.591  ns/op
+BigDecimals.hugePlainToString               avgt   15   157.425 ±  1.655  ns/op
+BigDecimals.largeScale2EngineeringToString  avgt   15    18.381 ±  0.037  ns/op
+BigDecimals.largeScale2LayoutCharsToString  avgt   15    18.158 ±  0.048  ns/op
+BigDecimals.largeScale2PlainToString        avgt   15    18.416 ±  0.034  ns/op
+BigDecimals.largeScale3EngineeringToString  avgt   15    19.319 ±  0.035  ns/op
+BigDecimals.largeScale3LayoutCharsToString  avgt   15    19.081 ±  0.021  ns/op
+BigDecimals.largeScale3PlainToString        avgt   15    19.771 ±  0.063  ns/op
+BigDecimals.smallScale2EngineeringToString  avgt   15    11.122 ±  0.031  ns/op
+BigDecimals.smallScale2LayoutCharsToString  avgt   15    11.105 ±  0.037  ns/op
+BigDecimals.smallScale2PlainToString        avgt   15    11.531 ±  0.030  ns/op
+BigDecimals.smallScale3EngineeringToString  avgt   15    15.830 ±  0.032  ns/op
+BigDecimals.smallScale3LayoutCharsToString  avgt   15    15.821 ±  0.047  ns/op
+BigDecimals.smallScale3PlainToString        avgt   15    15.430 ±  0.176  ns/op


|   | baseline  | current | delta |
| --- | --- | --- | --- |
| BigDecimals.hugeEngineeringToString | 170.621 | 158.130 | 7.90% |
| BigDecimals.hugeLayoutCharsToString | 169.597 | 156.163 | 8.60% |
| BigDecimals.hugePlainToString | 156.598 | 157.425 | -0.53% |
| BigDecimals.largeScale2EngineeringToString | 34.733 | 18.381 | 88.96% |
| BigDecimals.largeScale2LayoutCharsToString | 33.044 | 18.158 | 81.98% |
| BigDecimals.largeScale2PlainToString | 30.302 | 18.416 | 64.54% |
| BigDecimals.largeScale3EngineeringToString | 39.054 | 19.319 | 102.15% |
| BigDecimals.largeScale3LayoutCharsToString | 39.180 | 19.081 | 105.34% |
| BigDecimals.largeScale3PlainToString | 31.261 | 19.771 | 58.12% |
| BigDecimals.smallScale2EngineeringToString | 11.364 | 11.122 | 2.18% |
| BigDecimals.smallScale2LayoutCharsToString | 11.387 | 11.105 | 2.54% |
| BigDecimals.smallScale2PlainToString | 29.513 | 11.531 | 155.94% |
| BigDecimals.smallScale3EngineeringToString | 33.208 | 15.830 | 109.78% |
| BigDecimals.smallScale3LayoutCharsToString | 33.171 | 15.821 | 109.66% |
| BigDecimals.smallScale3PlainToString | 28.995 | 15.430 | 87.91% |



## 3. The performance numbers under MacBook M1 Pro

-# baseline
-Benchmark                                   Mode  Cnt     Score    Error  Units (cb88e0efe6c)
-BigDecimals.hugeEngineeringToString         avgt   15   193.054 ? 26.472  ns/op
-BigDecimals.hugeLayoutCharsToString         avgt   15   212.770 ?  6.918  ns/op
-BigDecimals.hugePlainToString               avgt   15   230.857 ?  4.276  ns/op
-BigDecimals.largeScale2EngineeringToString  avgt   15    45.413 ?  1.318  ns/op
-BigDecimals.largeScale2LayoutCharsToString  avgt   15    46.862 ?  0.878  ns/op
-BigDecimals.largeScale2PlainToString        avgt   15    33.184 ?  2.787  ns/op
-BigDecimals.largeScale3EngineeringToString  avgt   15    71.579 ?  3.913  ns/op
-BigDecimals.largeScale3LayoutCharsToString  avgt   15    70.623 ?  4.559  ns/op
-BigDecimals.largeScale3PlainToString        avgt   15    30.200 ?  1.164  ns/op
-BigDecimals.smallScale2EngineeringToString  avgt   15     9.788 ?  0.097  ns/op
-BigDecimals.smallScale2LayoutCharsToString  avgt   15     9.741 ?  0.046  ns/op
-BigDecimals.smallScale2PlainToString        avgt   15    35.357 ?  1.161  ns/op
-BigDecimals.smallScale3EngineeringToString  avgt   15    53.001 ?  2.682  ns/op
-BigDecimals.smallScale3LayoutCharsToString  avgt   15    52.704 ?  2.706  ns/op
-BigDecimals.smallScale3PlainToString        avgt   15    35.690 ?  2.847  ns/op


+# current
+Benchmark                                   Mode  Cnt     Score    Error  Units (cb88e0efe6c)
+BigDecimals.hugeEngineeringToString         avgt   15   194.490 ? 39.908  ns/op
+BigDecimals.hugeLayoutCharsToString         avgt   15   170.158 ? 39.788  ns/op
+BigDecimals.hugePlainToString               avgt   15   139.038 ?  0.640  ns/op
+BigDecimals.largeScale2EngineeringToString  avgt   15    15.172 ?  0.186  ns/op
+BigDecimals.largeScale2LayoutCharsToString  avgt   15    15.118 ?  0.082  ns/op
+BigDecimals.largeScale2PlainToString        avgt   15    15.247 ?  0.125  ns/op
+BigDecimals.largeScale3EngineeringToString  avgt   15    16.643 ?  0.085  ns/op
+BigDecimals.largeScale3LayoutCharsToString  avgt   15    16.653 ?  0.229  ns/op
+BigDecimals.largeScale3PlainToString        avgt   15    16.970 ?  0.115  ns/op
+BigDecimals.smallScale2EngineeringToString  avgt   15     9.893 ?  0.051  ns/op
+BigDecimals.smallScale2LayoutCharsToString  avgt   15     9.952 ?  0.149  ns/op
+BigDecimals.smallScale2PlainToString        avgt   15    10.058 ?  0.023  ns/op
+BigDecimals.smallScale3EngineeringToString  avgt   15    14.146 ?  0.198  ns/op
+BigDecimals.smallScale3LayoutCharsToString  avgt   15    14.147 ?  0.035  ns/op
+BigDecimals.smallScale3PlainToString        avgt   15    14.068 ?  0.029  ns/op


|   | baseline  | current | delta |
| --- | --- | --- | --- |
| BigDecimals.hugeEngineeringToString | 193.054 | 194.490 | -0.74% |
| BigDecimals.hugeLayoutCharsToString | 212.770 | 170.158 | 25.04% |
| BigDecimals.hugePlainToString | 230.857 | 139.038 | 66.04% |
| BigDecimals.largeScale2EngineeringToString | 45.413 | 15.172 | 199.32% |
| BigDecimals.largeScale2LayoutCharsToString | 46.862 | 15.118 | 209.97% |
| BigDecimals.largeScale2PlainToString | 33.184 | 15.247 | 117.64% |
| BigDecimals.largeScale3EngineeringToString | 71.579 | 16.643 | 330.08% |
| BigDecimals.largeScale3LayoutCharsToString | 70.623 | 16.653 | 324.09% |
| BigDecimals.largeScale3PlainToString | 30.200 | 16.970 | 77.96% |
| BigDecimals.smallScale2EngineeringToString | 9.788 | 9.893 | -1.06% |
| BigDecimals.smallScale2LayoutCharsToString | 9.741 | 9.952 | -2.12% |
| BigDecimals.smallScale2PlainToString | 35.357 | 10.058 | 251.53% |
| BigDecimals.smallScale3EngineeringToString | 53.001 | 14.146 | 274.67% |
| BigDecimals.smallScale3LayoutCharsToString | 52.704 | 14.147 | 272.55% |
| BigDecimals.smallScale3PlainToString | 35.690 | 14.068 | 153.70% |

-------------

PR Comment: https://git.openjdk.org/jdk/pull/23310#issuecomment-2618074326


More information about the core-libs-dev mailing list