RFR: 8347009: Speed ​​up parseInt and parseLong [v8]

Shaojin Wen swen at openjdk.org
Sat Jan 25 03:08:47 UTC 2025


On Sat, 25 Jan 2025 02:20:34 GMT, Shaojin Wen <swen at openjdk.org> wrote:

>> This is an optimization for decimal Integer.parseInt and Long.parseLong, which improves performance by about 10%. The optimization includes:
>> 1. Improve performance by parsing 2 numbers at a time, which has performance improvements for numbers with length >= 3.
>> 2. It uses charAt(0) for the first number. Assuming that the optimization can eliminate boundary checks, this will be more friendly to parsing numbers with length 1.
>> 3. It removes the reliance on the Character.digit method and eliminates the reliance on the CharacterDataLatin1#DIGITS cache array, which avoids performance degradation caused by cache misses.
>
> Shaojin Wen has updated the pull request incrementally with one additional commit since the last revision:
> 
>   use &

After accepting rgiulietti's suggestion, the performance was further improved, and the performance numbers are as follows

## 1. Script

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

#master
git checkout 5bb9644202a8b961faad02439c95a81ca6862168
make test TEST="micro:java.lang.Longs.parseLong"
make test TEST="micro:java.lang.Integers.parseInt" 

git checkout f97093d324fbb7de322c86d52db11cafcff2de87
make test TEST="micro:java.lang.Longs.parseLong"
make test TEST="micro:java.lang.Integers.parseInt" 


# current
git checkout dc2a6758f33daacde63189a2239b1fac1470a937 
make test TEST="micro:java.lang.Longs.parseLong"
make test TEST="micro:java.lang.Integers.parseInt"





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

Benchmark          (size)  Mode  Cnt  Score   Error  Units (5bb9644)
Longs.parseLong       500  avgt   15  3.538 ± 0.019  us/op
Integers.parseInt     500  avgt   15  3.276 ± 0.004  us/op

Benchmark          (size)  Mode  Cnt  Score   Error  Units (f97093d)
Longs.parseLong       500  avgt   15  2.960 ± 0.013  us/op +19.52%
Integers.parseInt     500  avgt   15  3.116 ± 0.004  us/op  +5.13%


Benchmark          (size)  Mode  Cnt  Score   Error  Units (dc2a675)
Longs.parseLong       500  avgt   15  2.911 ± 0.016  us/op +21.58%
Integers.parseInt     500  avgt   15  2.985 ± 0.011  us/op  +9.74%



## 3. aliyun_ecs_c8i_x64 (CPU Intel®Xeon®Emerald Rapids)

Benchmark          (size)  Mode  Cnt  Score   Error  Units (5bb9644)
Longs.parseLong       500  avgt   15  3.468 ± 0.010  us/op
Integers.parseInt     500  avgt   15  3.137 ± 0.007  us/op

Benchmark          (size)  Mode  Cnt  Score   Error  Units (f97093d)
Longs.parseLong       500  avgt   15  2.996 ± 0.020  us/op +15.75%
Integers.parseInt     500  avgt   15  2.822 ± 0.005  us/op +11.16%

Benchmark          (size)  Mode  Cnt  Score   Error  Units (dc2a675)
Longs.parseLong       500  avgt   15  2.850 ± 0.009  us/op +21.68%
Integers.parseInt     500  avgt   15  2.772 ± 0.004  us/op +13.16%



## 4. aliyun_ecs_c8y_aarch64 (CPU Aliyun Yitian 710)

Benchmark          (size)  Mode  Cnt  Score   Error  Units (5bb9644)
Longs.parseLong       500  avgt   15  3.827 ± 0.033  us/op
Integers.parseInt     500  avgt   15  3.589 ± 0.038  us/op

Benchmark          (size)  Mode  Cnt  Score   Error  Units (f97093d)
Longs.parseLong       500  avgt   15  3.394 ± 0.033  us/op +12.75%
Integers.parseInt     500  avgt   15  3.090 ± 0.014  us/op +16.14%

Benchmark          (size)  Mode  Cnt  Score   Error  Units (dc2a675)
Longs.parseLong       500  avgt   15  3.293 ± 0.080  us/op +16.21%
Integers.parseInt     500  avgt   15  3.102 ± 0.010  us/op +15.69%




## 5. orange_pi5_aarch64 (CPU RK3588S)

Benchmark          (size)  Mode  Cnt  Score   Error  Units
Longs.parseLong       500  avgt   15  9.342 ± 0.610  us/op (5bb9644)
Integers.parseInt     500  avgt   15  9.217 ± 0.572  us/op

Benchmark          (size)  Mode  Cnt  Score   Error  Units (f97093d)
Longs.parseLong       500  avgt   15  7.986 ± 0.499  us/op +16.97%
Integers.parseInt     500  avgt   15  6.093 ± 0.020  us/op +15.13%

Benchmark          (size)  Mode  Cnt  Score   Error  Units (dc2a675)
Longs.parseLong       500  avgt   15  6.882 ± 0.240  us/op +35.74%
Integers.parseInt     500  avgt   15  6.104 ± 0.226  us/op +50.99%



# 6. MacBook M1 Pro (aarch64)

Benchmark          (size)  Mode  Cnt  Score   Error  Units (5bb9644)
Longs.parseLong       500  avgt   15  2.673 ? 0.026  us/op
Integers.parseInt     500  avgt   15  2.358 ? 0.035  us/op

Benchmark          (size)  Mode  Cnt  Score   Error  Units (f97093d)
Longs.parseLong       500  avgt   15  2.283 ? 0.027  us/op +17.08%
Integers.parseInt     500  avgt   15  2.045 ? 0.027  us/op +15.30%

Benchmark          (size)  Mode  Cnt  Score   Error  Units (dc2a675)
Longs.parseLong       500  avgt   15  2.212 ? 0.016  us/op +20.84%
Integers.parseInt     500  avgt   15  1.994 ? 0.010  us/op +18.25%

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

PR Comment: https://git.openjdk.org/jdk/pull/22919#issuecomment-2613746684


More information about the core-libs-dev mailing list