RFR: 8347009: Speed up parseInt and parseLong [v3]
Shaojin Wen
swen at openjdk.org
Sun Jan 5 07:10:08 UTC 2025
On Sat, 4 Jan 2025 18:18:47 GMT, j3graham <duke at openjdk.org> wrote:
> Some other thoughts that might help here; except for leading zeros, 9 (or 18 for a long) or fewer digits cannot overflow. So something like this might work:
>
> * read first char and check if it is a sign character.
> * skip leading zeros
> * loop over up to 9 digits, performing the calculation without needing to check for overflow. I think it would be enough to do this 1 digit at a time.
> * If there are any digits left, take only the next digit, and incorporate it into the result while doing the overflow check.
> * If there are still more digits left it is too big to fit.
>
> This approach could also be taken for the more general parse methods.
Thanks for your advice!
1. The current implementation is to determine whether the first character is `+/-`, but the writing method is to reduce the CodeSize, which is not easy to read, but I added a comment.
int neg;
if ((neg = (c = value[0]) - '-') != 0
&& neg + 2 != 0 // firstChar != '+'
) {
2. The leading zero scenario is not common, and there is no need to optimize this scenario.
3. The current cost of judging result < MULT_MIN_10 or result < MULT_MIN_100 is not high.
4. It is necessary to control codeSize <= 325 to enable inline. The code here is written with the minimum codeSize
-------------
PR Comment: https://git.openjdk.org/jdk/pull/22919#issuecomment-2571447521
More information about the core-libs-dev
mailing list