On Thu, 31 Aug 2023 19:53:17 GMT, Claes Redestad <redes...@openjdk.org> wrote:

>> 温绍锦 has updated the pull request incrementally with one additional commit 
>> since the last revision:
>> 
>>   assert bounds check
>
> src/java.base/share/classes/java/lang/StringUTF16.java line 1585:
> 
>> 1583:                     buf,
>> 1584:                     Unsafe.ARRAY_BYTE_BASE_OFFSET + (charPos << 1),
>> 1585:                     PACKED_DIGITS_UTF16[r]);
> 
> What performance would you get if you used the same lookup table as the other 
> implementations, but inflate the value to UTF-16 on the fly?
> 
> 
> int packed = (int)Integer.PACKED_DIGITS[r];
> int inflated = ((packed & 0xFF00) << 8) | (packed & 0xFF));
> UNSAFE.putIntUnaligned(
>                     buf,
>                     Unsafe.ARRAY_BYTE_BASE_OFFSET + (charPos << 1),
>                     inflated);
> 
> 
> This would avoid juggling more lookup table data around than before, 
> alleviating some of the concerns voiced in this PR comment thread.

Good suggestion, using the same lookup table, we can get similar performance.


  int packed = (int) Integer.PACKED_DIGITS[-i];
  int inflated = ((packed & 0xFF00) << 8) | (packed & 0xFF);

  charPos -= 2;
  assert charPos >= 0 && charPos < buf.length : "Trusted caller missed bounds 
check";
  UNSAFE.putIntUnaligned(
          buf,
          Unsafe.ARRAY_BYTE_BASE_OFFSET + (charPos << 1),
          inflated, 
          false);


The performance comparison data is as follows:


-Benchmark                                 Mode  Cnt   Score   Error  Units
-StringBuilders.toStringCharWithInt8UTF16  avgt   15  26.812 ± 0.095  ns/op

+Benchmark                                 Mode  Cnt   Score   Error  Units  
(use same lookup table)
+StringBuilders.toStringCharWithInt8UTF16  avgt   15  27.807 ± 0.046  ns/op

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/14699#discussion_r1312910616

Reply via email to