RFR: 8318457: Use prefix-less prepend methods directly to reduce branches in String concat expressions

Chen Liang liach at openjdk.org
Thu Oct 19 02:18:47 UTC 2023


On Wed, 18 Oct 2023 11:56:14 GMT, Claes Redestad <redestad at openjdk.org> wrote:

> In #16006 using `StringConcatFactory` seem to induce a run-to-run variance. One idea to reduce this is to generate expression trees with fewer branches by looking up and using the prefix-less `prepend` methods directly for cases where constant is null/empty so that the prefixed prepender will always deal with a non-null prefix constant.

src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java line 725:

> 723:     }
> 724: 
> 725:     private static MethodHandle noPrefixPrepender(Class<?> cl) {

Should the no-prefix prependers be declared package-private now that they are accessed via JLA? Otherwise we might accidentally change those APIs and break stuff.

Another way to guard is to make stringConcatHelper find methods with a lookup restricted to package access by changing this line: https://github.com/openjdk/jdk/blob/e25a49a993f270c33f7929e629fb3075a11fdec9/src/java.base/share/classes/java/lang/StringConcatHelper.java#L589
to

return MethodHandles.lookup()
        .dropLookupMode(MethodHandles.Lookup.PRIVATE)
        .findStatic(StringConcatHelper.class, name, methodType);

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16244#discussion_r1364794177


More information about the core-libs-dev mailing list