RFR: 8355177: Speed up StringBuilder::append(char[]) via Unsafe::copyMemory [v8]
Shaojin Wen
swen at openjdk.org
Mon Jul 28 01:09:09 UTC 2025
On Sun, 27 Jul 2025 04:37:32 GMT, Shaojin Wen <swen at openjdk.org> wrote:
>> src/java.base/share/classes/java/lang/StringUTF16.java line 1489:
>>
>>> 1487: Unsafe.ARRAY_CHAR_BASE_OFFSET + ((long) off << 1),
>>> 1488: val,
>>> 1489: Unsafe.ARRAY_BYTE_BASE_OFFSET + ((long) index << 1),
>>
>> Suggestion:
>>
>> Unsafe.ARRAY_BYTE_BASE_OFFSET + ((long) index << 1) * Unsafe.ARRAY_BYTE_INDEX_SCALE,
>
> If we want to use ARRAY_CHAR_INDEX_SCALE, it should be used as follows
>
> Unsafe.getUnsafe().copyMemory(
> ca,
> Unsafe.ARRAY_CHAR_BASE_OFFSET + (long) off * Unsafe.ARRAY_CHAR_INDEX_SCALE,
> val,
> Unsafe.ARRAY_CHAR_BASE_OFFSET + (long) off * Unsafe.ARRAY_CHAR_INDEX_SCALE,
> (long) (end - off) << 1);
I prefer to calculate an ARRAY_CHAR_SHIFT in the constant like ShortVector does, like this
static final int ARRAY_CHAR_SHIFT
= 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_CHAR_INDEX_SCALE);
Unsafe.getUnsafe().copyMemory(
ca,
Unsafe.ARRAY_CHAR_BASE_OFFSET + (long) off << ARRAY_CHAR_SHIFT,
val,
Unsafe.ARRAY_CHAR_BASE_OFFSET + (long) off << ARRAY_CHAR_SHIFT,
(long) (end - off) << 1);
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24773#discussion_r2234230546
More information about the core-libs-dev
mailing list