RFR: 8355177: Speed up StringBuilder::append(char[]) via UTF16::compress & Unsafe::copyMemory
Markus KARG
duke at openjdk.org
Fri May 2 06:18:46 UTC 2025
On Mon, 21 Apr 2025 15:19:40 GMT, Chen Liang <liach at openjdk.org> wrote:
> This might be helpful combined with #21730.
That implies creating a copy of the chars:
private final void appendChars(CharSequence s, int off, int end) {
if (isLatin1()) {
byte[] val = this.value;
// ----- Begin of Experimental Section -----
char[] ca = new char[end - off];
s.getChars(off, end, ca, 0);
int compressed = StringUTF16.compress(ca, 0, val, count, end - off);
count += compressed;
off += compressed;
// ----- End of Experimental Section -----
for (int i = off, j = count; i < end; i++) {
char c = s.charAt(i);
if (StringLatin1.canEncode(c)) {
val[j++] = (byte)c;
} else {
count = j;
inflate();
// Store c to make sure sb has a UTF16 char
StringUTF16.putCharSB(this.value, j++, c);
count = j;
i++;
StringUTF16.putCharsSB(this.value, j, s, i, end);
count += end - i;
return;
}
}
} else {
StringUTF16.putCharsSB(this.value, count, s, off, end);
}
count += end - off;
}
While I do *assume* that it should faster to let machine code perform the copy and compression over letting Java code perform a char-by-char approach, to be sure there should be another benchmark to actually proof this claim.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/24773#issuecomment-2846452819
More information about the core-libs-dev
mailing list