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