RFR: 8336831: Optimize StringConcatHelper.simpleConcat [v2]

Shaojin Wen duke at openjdk.org
Fri Jul 19 21:13:31 UTC 2024


On Fri, 19 Jul 2024 20:43:42 GMT, Chen Liang <liach at openjdk.org> wrote:

>> Shaojin Wen has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   share newArray
>
> As annoying and risky as this first appeared, this patch is actually in quite good shape: The usage of `getBytes` is similar to those in StringUTF16, and there's no reason to further complicate this by splitting the handling into StringLatin1 and StringUTF16. 👍 
> 
> Another question for you: can you check out the original form over here too? https://github.com/openjdk/jdk/commit/781fb29580b08fa659019a2da09488ee4711c017#diff-f8131d8a48caf7cfc908417fad241393c2ef55408172e9a28dcaa14b1d73e1fbL1968-L1981
> 
> `simpleConcat` is required to create new String objects and `String.concat` can just return the argument/original when one part is not empty. Is there any value to extract a common `doConcat` handling both non-empty strings, called by both methods after handling the empty cases?

@liach is this what you want to change it to?

class String {
    public String concat(String str) {
        if (str.isEmpty()) {
            return this;
        }
        return StringConcatHelper.doConcat(this, str);
    }
}

class StringConcatHelper {
    @ForceInline
    static String simpleConcat(Object first, Object second) {
        String s1 = stringOf(first);
        String s2 = stringOf(second);
        if (s1.isEmpty()) {
            // newly created string required, see JLS 15.18.1
            return new String(s2);
        }
        if (s2.isEmpty()) {
            // newly created string required, see JLS 15.18.1
            return new String(s1);
        }
        return doConcat(s1, s2);
    }

    @ForceInline
    static String doConcat(String s1, String s2) {
        byte coder = (byte) (s1.coder() | s2.coder());
        int newLength = (s1.length() + s2.length()) << coder;
        byte[] buf = newArray(newLength);
        s1.getBytes(buf, 0, coder);
        s2.getBytes(buf, s1.length(), coder);
        return new String(buf, coder);
    }
}

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

PR Comment: https://git.openjdk.org/jdk/pull/20253#issuecomment-2240106042


More information about the core-libs-dev mailing list