<i18n dev> RFR: 8317980: Optimization for Integer.parseInt and Long.parseLong [v2]
Shaojin Wen
duke at openjdk.org
Sat Jul 13 03:54:53 UTC 2024
On Sat, 13 Jul 2024 00:50:18 GMT, Shaojin Wen <duke at openjdk.org> wrote:
>> Currently, about 25% of the time spent by the Integer.parseInt and Long.parseLong methods is spent on the Character.digit method.
>>
>> The Character.digit method is common to all radixes. We can use a digit method optimized for Latin1 encoding radix 10 to improve the performance of Integer.parseInt and Long.parseLong methods.
>
> Shaojin Wen has updated the pull request incrementally with one additional commit since the last revision:
>
> Reduce changes
> A straightforward guess would be converting the `Character.digit()` call to a utility method like:
>
> ```java
> private static int digit(char ch/*, int radix*/) {
> if (ch >= '0' && ch <= '9') // or replace it with something like Math.min('9', '0' + radix)
> return ch - '0'; // ascii base-10 fast path
> return digit(ch/*, radix*/);
> }
> ```
>
> Inspired by this:
>
> https://github.com/openjdk/jdk/blob/ae9f318fc35eeab497e546ebab9faed6ec774ec5/src/java.base/share/classes/jdk/internal/constant/ConstantUtils.java#L236
>
> However I don't know how JIT has compiled the code, so not sure how my speculative approach works compared to yours. But it is definitely somewhat less invasive, without the new table and latin1 requirements.
In the parse scenario, I made many attempts and found no method faster than table lookup, because the input length will be greater than 1 and the table will be looked up multiple times. In this scenario, I think it is correct to use table lookup.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/20168#issuecomment-2226754795
More information about the i18n-dev
mailing list