RFR: 8310929: Optimization for Integer.toString [v2]
温绍锦
duke at openjdk.org
Thu Jun 29 18:10:24 UTC 2023
On Wed, 28 Jun 2023 22:19:04 GMT, 温绍锦 <duke at openjdk.org> wrote:
>> Speed up Integer.toString with a precomputed cache array of length 1000, use division by 1000, so that each iteration can calculate three digits.
>>
>> this optimization can also be used in StringBuilder#appent(int) and Long#toString.
>>
>> # Benchmark Result
>>
>>
>> bash configure --with-jmh=build/jmh/jars
>> make test TEST="micro:java.lang.Integers.toString*"
>>
>>
>> ## 1. [aliyun_ecs_c8i.xlarge](https://help.aliyun.com/document_detail/25378.html#c8i)
>> * cpu : intel xeon sapphire rapids (x64)
>> ``` diff
>> -Benchmark (size) Mode Cnt Score Error Units (baseline)
>> -Integers.toStringBig 500 avgt 15 6.811 ± 0.016 us/op
>> -Integers.toStringSmall 500 avgt 15 4.794 ± 0.011 us/op
>> -Integers.toStringTiny 500 avgt 15 3.752 ± 0.065 us/op
>>
>> +Benchmark (size) Mode Cnt Score Error Units (PR commit-id 3355d211)
>> +Integers.toStringBig 500 avgt 15 5.148 ± 0.044 us/op (+32.30%)
>> +Integers.toStringSmall 500 avgt 15 3.820 ± 0.016 us/op (+25.48%)
>> +Integers.toStringTiny 500 avgt 15 3.426 ± 0.010 us/op (+9.51%)
>>
>>
>> ## 2. [aliyun_ecs_c8a.xlarge](https://help.aliyun.com/document_detail/25378.html#c8a)
>> * cpu : amd epc genoa (x64)
>> ``` diff
>> -Benchmark (size) Mode Cnt Score Error Units (baseline)
>> -Integers.toStringBig 500 avgt 15 6.762 ± 0.018 us/op
>> -Integers.toStringSmall 500 avgt 15 4.481 ± 0.004 us/op
>> -Integers.toStringTiny 500 avgt 15 2.761 ± 0.012 us/op
>>
>> +Benchmark (size) Mode Cnt Score Error Units (PR commit-id 3355d211)
>> +Integers.toStringBig 500 avgt 15 4.901 ± 0.005 us/op (+37.97%)
>> +Integers.toStringSmall 500 avgt 15 3.515 ± 0.204 us/op (+27.48%)
>> +Integers.toStringTiny 500 avgt 15 2.698 ± 0.190 us/op (+2.33%)
>>
>>
>> ## 3. [aliyun_ecs_c8y.xlarge](https://help.aliyun.com/document_detail/25378.html#c8y)
>> * cpu : aliyun yitian 710 (aarch64)
>> ``` diff
>> -Benchmark (size) Mode Cnt Score Error Units (baseline)
>> -Integers.toStringBig 500 avgt 15 12.081 ± 0.377 us/op
>> -Integers.toStringSmall 500 avgt 15 7.119 ± 0.177 us/op
>> -Integers.toStringTiny 500 avgt 15 6.323 ± 0.239 us/op
>>
>> +Benchmark (size) Mode Cnt Score Error Units (PR commit-id 3355d211)
>> +Integers.toStringBig 500 avgt 15 8.279 ± 0.184 us/op (+45.92%)
>> +Integers.toStringSmall 500 avgt 15 7.2...
>
> 温绍锦 has updated the pull request incrementally with one additional commit since the last revision:
>
> postpone the division
> ```diff
> 9.51
> ```
caching tinyInt result string is a good idea, it can improve performance, but it is expensive, i am not sure whether it should be added.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/14699#issuecomment-1613582797
More information about the core-libs-dev
mailing list