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