<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    Hi,<br>
    <br>
    Unsafe.uninitializedArray and StringConcatHelper.newArray was
    created for the exclusive use of StringConcatHelper and by  HotSpot
    optimizations. Unsafe.uninitializedArray and
    StringConcatHelper.newArray area very sensitive APIs and should NOT
    be used anywhere except in StringConcatHelper and HotSpot.<br>
    <br>
    Regards, Roger<br>
    <br>
    <br>
    <div class="moz-cite-prefix">On 7/30/25 11:40 AM,
      <a class="moz-txt-link-abbreviated" href="mailto:jaikiran.pai@oracle.com">jaikiran.pai@oracle.com</a> wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:c8e344e8-f63a-49b1-b5d2-3fb19977e74a@oracle.com">
      
      <p>I'll let others knowledgeable in this area to comment and
        provide inputs to this proposal. I just want to say thank you
        for bringing up this discussion to the mailing list first,
        providing the necessary context and explanation and seeking
        feedback, before creating a JBS issue or a RFR PR.</p>
      <p>-Jaikiran<br>
      </p>
      <div class="moz-cite-prefix">On 30/07/25 7:48 pm, wenshao wrote:<br>
      </div>
      <blockquote type="cite" cite="mid:086fd3c9-30e0-4294-b674-ece0bd91051c.shaojin.wensj@alibaba-inc.com">
        <div class="__aliyun_email_body_block">
          <div style="font-family: Tahoma, Arial, STHeitiSC-Light, SimSun">
            <div style="clear: both;"><span>In the discussion of
                `8355177: Speed up StringBuilder::append(char[]) via
                Unsafe::copyMemory` (<a href="https://github.com/openjdk/jdk/pull/24773" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/openjdk/jdk/pull/24773</a>),
                @liach (<span>Chen Liang)</span> suggested reusing the
                StringUTF16::putCharsSB method introduced in PR #24773
                instead of the Intrinsic implementation in the
                StringUTF16::toBytes method.</span>
              <div style="clear: both;"><br>
              </div>
              <div style="clear: both;"><span>Original:</span>
                <div style="clear: both;">```java</div>
                <div style="clear: both;">    @IntrinsicCandidate</div>
                <div style="clear: both;">    public static byte[]
                  toBytes(char[] value, int off, int len) {</div>
                <div style="clear: both;">        byte[] val =
                  newBytesFor(len);</div>
                <div style="clear: both;">        for (int i = 0; i <
                  len; i++) {</div>
                <div style="clear: both;">            putChar(val, i,
                  value[off]);</div>
                <div style="clear: both;">            off++;</div>
                <div style="clear: both;">        }</div>
                <div style="clear: both;">        return val;</div>
                <div style="clear: both;">    }</div>
                <div style="clear: both;">```</div>
                <div style="clear: both;"><br>
                </div>
                <div style="clear: both;">After:</div>
                <div style="clear: both;">```java</div>
                <div style="clear: both;">    public static byte[]
                  toBytes(char[] value, int off, int len) {</div>
                <div style="clear: both;">        byte[] val = (byte[])
Unsafe.getUnsafe().allocateUninitializedArray(byte.class,
                  newBytesLength(len));</div>
                <div style="clear: both;">        putCharsSB(val, 0,
                  value, off, off + len);</div>
                <div style="clear: both;">        return val;</div>
                <div style="clear: both;">    }</div>
                <span>```</span></div>
              <div style="clear: both;"><br>
              </div>
              <div style="clear: both;">This replacement does not
                degrade performance. Running
                StringConstructor.newStringFromCharsMixedBegin verified
                that performance is consistent with the original on x64
                and slightly improved on aarch64.</div>
              <div style="clear: both;"><br>
              </div>
              <span>The implementation after replacing the Intrinsic
                implementation removed 100 lines of C++ code, leaving
                only Java and Unsafe code, no Intrinsic or C++ code,
                which makes the code more maintainable.</span></div>
            <div style="clear: both;"><span><br>
              </span></div>
            <div style="clear: both;"><span><span>I've submitted a draft
                  PR </span><span><a href="https://github.com/openjdk/jdk/pull/26553" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/openjdk/jdk/pull/26553</a>
                  , please give me some feedback.</span></span></div>
            <div style="clear: both;"><span>-</span></div>
            <div style="clear: both;"><span>Shaojin Wen</span></div>
          </div>
        </div>
      </blockquote>
    </blockquote>
    <br>
  </body>
</html>