On Thu, 4 Dec 2025 14:02:16 GMT, Shaojin Wen <[email protected]> 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:
> 
>   remove unsafe

In my latest implementation, I removed `Unsafe` from the 
`DecimalDigits::digit2` method, which resulted in a performance decrease, but 
it's still better than the master branch. Below are my performance tests on x64 
and aarch64:


# 1. Test Script

git remote add wenshao [email protected]:wenshao/jdk.git
git fetch wenshao

# base (master banch)
git checkout 9ea0dcd3eaf07658aeb92ba0defb5098e1f7b192
make test TEST="micro:java.lang.Longs.parseLong"
make test TEST="micro:java.lang.Integers.parseInt" 

# Digit2 (current)
git checkout cebefd7b89f2dbf29bb13c4903060707a5574e67
make test TEST="micro:java.lang.Longs.parseLong"
make test TEST="micro:java.lang.Integers.parseInt" 

# Digit2_Unsafe (before)
git checkout c58aa7071867f386407f33defe2b346176fc1e91
make test TEST="micro:java.lang.Longs.parseLong"
make test TEST="micro:java.lang.Integers.parseInt" 


# 2. Performance Results  on MacBook M1 Pro

* Raw Data

# base
Benchmark          (size)  Mode  Cnt  Score   Error  Units
Integers.parseInt     500  avgt   15  2.371 ± 0.012  us/op
Longs.parseLong       500  avgt   15  2.731 ± 0.030  us/op

# digit2
Benchmark          (size)  Mode  Cnt  Score   Error  Units
Integers.parseInt     500  avgt   15  2.221 ± 0.009  us/op
Longs.parseLong       500  avgt   15  2.517 ± 0.016  us/op

# digit2_unsafe
Benchmark          (size)  Mode  Cnt  Score   Error  Units
Integers.parseInt     500  avgt   15  2.114 ± 0.012  us/op
Longs.parseLong       500  avgt   15  2.344 ± 0.028  us/op


* Comparison

| Benchmark | base | Digit2 | Digit2_Unsafe | base vs Digit2 (%) | Digit2 vs 
Digit2_Unsafe (%) |
|-----------|--------|--------|---------------|----------------------|------------------------------|
| Integers.parseInt | 2.371 | 2.221 | 2.114 | +6.33% | +4.82% |
| Longs.parseLong | 2.731 | 2.517 | 2.344 | +7.84% | +6.87% |


# 3. Performance Results  on  Aliyun_ECS_c9a (x64, AMD AMD EPYC™ Turin)

* Row Data

# base
Benchmark          (size)  Mode  Cnt  Score   Error  Units
Integers.parseInt     500  avgt   15  2.541 ± 0.022  us/op
Longs.parseLong       500  avgt   15  2.941 ± 0.014  us/op

# digit2
Benchmark          (size)  Mode  Cnt  Score   Error  Units
Integers.parseInt     500  avgt   15  2.542 ± 0.003  us/op
Longs.parseLong       500  avgt   15  2.527 ± 0.014  us/op

# digit2_unsafe
Benchmark          (size)  Mode  Cnt  Score   Error  Units
Integers.parseInt     500  avgt   15  2.244 ± 0.010  us/op
Longs.parseLong       500  avgt   15  2.432 ± 0.033  us/op


* Comparison

| benchmark | master | digit2 | digit2_unsafe | master vs digit2 | digit2 vs 
digit2_unsafe |
|-----------|--------|--------|---------------|------------------|------------------------|
| Integers.parseInt | 2.541 | 2.542 | 2.244 | -0.04% | 13.28% |
| Longs.parseLong | 2.941 | 2.527 | 2.432 | 16.38% | 3.91% |

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

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

Reply via email to