On Sat, 13 Jul 2024 00:50:18 GMT, Shaojin Wen <d...@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