RFR: 8355177: Speed up StringBuilder::append(char[]) via Unsafe::copyMemory [v8]
Shaojin Wen
swen at openjdk.org
Mon Jul 28 01:14:10 UTC 2025
On Mon, 28 Jul 2025 01:06:46 GMT, Shaojin Wen <swen at openjdk.org> wrote:
>> 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);
String uses `<< coder` in many places. I think the following way of writing is also good:
Unsafe.getUnsafe().copyMemory(
ca,
Unsafe.ARRAY_CHAR_BASE_OFFSET + (long) off << String.UTF16,
val,
Unsafe.ARRAY_CHAR_BASE_OFFSET + (long) off << String.UTF16,
(long) (end - off) << 1);
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24773#discussion_r2234242815
More information about the core-libs-dev
mailing list