mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8310929: Optimization for Integer.toString
Reviewed-by: redestad, rriggs
This commit is contained in:
parent
111ecdbaf5
commit
4b43c25fe3
8 changed files with 215 additions and 172 deletions
|
@ -459,7 +459,7 @@ public final class Long extends Number
|
|||
int size = stringSize(i);
|
||||
if (COMPACT_STRINGS) {
|
||||
byte[] buf = new byte[size];
|
||||
getChars(i, size, buf);
|
||||
StringLatin1.getChars(i, size, buf);
|
||||
return new String(buf, LATIN1);
|
||||
} else {
|
||||
byte[] buf = new byte[size * 2];
|
||||
|
@ -486,65 +486,6 @@ public final class Long extends Number
|
|||
return toUnsignedString(i, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* Places characters representing the long i into the
|
||||
* character array buf. The characters are placed into
|
||||
* the buffer backwards starting with the least significant
|
||||
* digit at the specified index (exclusive), and working
|
||||
* backwards from there.
|
||||
*
|
||||
* @implNote This method converts positive inputs into negative
|
||||
* values, to cover the Long.MIN_VALUE case. Converting otherwise
|
||||
* (negative to positive) will expose -Long.MIN_VALUE that overflows
|
||||
* long.
|
||||
*
|
||||
* @param i value to convert
|
||||
* @param index next index, after the least significant digit
|
||||
* @param buf target buffer, Latin1-encoded
|
||||
* @return index of the most significant digit or minus sign, if present
|
||||
*/
|
||||
static int getChars(long i, int index, byte[] buf) {
|
||||
long q;
|
||||
int r;
|
||||
int charPos = index;
|
||||
|
||||
boolean negative = (i < 0);
|
||||
if (!negative) {
|
||||
i = -i;
|
||||
}
|
||||
|
||||
// Get 2 digits/iteration using longs until quotient fits into an int
|
||||
while (i <= Integer.MIN_VALUE) {
|
||||
q = i / 100;
|
||||
r = (int)((q * 100) - i);
|
||||
i = q;
|
||||
buf[--charPos] = Integer.DigitOnes[r];
|
||||
buf[--charPos] = Integer.DigitTens[r];
|
||||
}
|
||||
|
||||
// Get 2 digits/iteration using ints
|
||||
int q2;
|
||||
int i2 = (int)i;
|
||||
while (i2 <= -100) {
|
||||
q2 = i2 / 100;
|
||||
r = (q2 * 100) - i2;
|
||||
i2 = q2;
|
||||
buf[--charPos] = Integer.DigitOnes[r];
|
||||
buf[--charPos] = Integer.DigitTens[r];
|
||||
}
|
||||
|
||||
// We know there are at most two digits left at this point.
|
||||
buf[--charPos] = Integer.DigitOnes[-i2];
|
||||
if (i2 < -9) {
|
||||
buf[--charPos] = Integer.DigitTens[-i2];
|
||||
}
|
||||
|
||||
if (negative) {
|
||||
buf[--charPos] = (byte)'-';
|
||||
}
|
||||
return charPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string representation size for a given long value.
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue