RFR: 8341755: Optimize argNames in InnerClassLambdaMetafactory [v2]
Claes Redestad
redestad at openjdk.org
Tue Oct 8 18:35:46 UTC 2024
On Tue, 8 Oct 2024 18:03:14 GMT, Chen Liang <liach at openjdk.org> wrote:
>> src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java line 193:
>>
>>> 191: String argName = i < ARG_NAME_CACHE_SIZE ? ARG_NAME_CACHE[i] : null;
>>> 192: if (argName == null) {
>>> 193: argName = "arg$".concat(Integer.toString(i + 1));
>>
>> With `Integer.toString` in the mix perhaps just as well keep this as a standard concat?
>> Suggestion:
>>
>> argName = "arg$" + (i + 1);
>
> New bytecode in last commit's `computeArgName`:
>
> 0: ldc #186 // String arg$
> 2: iload_0
> 3: iconst_1
> 4: iadd
> 5: invokestatic #188 // Method java/lang/Integer.toString:(I)Ljava/lang/String;
> 8: invokevirtual #193 // Method java/lang/String.concat:(Ljava/lang/String;)Ljava/lang/String;
> 11: areturn
>
>
> Old bytecode in constructor:
>
> 222: iload 11
> 224: new #150 // class java/lang/StringBuilder
> 227: dup
> 228: invokespecial #152 // Method java/lang/StringBuilder."<init>":()V
> 231: ldc #155 // String arg$
> 233: invokevirtual #157 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 236: iload 11
> 238: iconst_1
> 239: iadd
> 240: invokevirtual #161 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
> 243: invokevirtual #164 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
> 246: aastore
> 247: aload_0
>
> I believe using concat is cleaner.
Irrelevant; idiomatic concatenation is more concise in source and easier to read, comprehend and check, so should generally be preferred. That the legacy javac concat translatiom is lousy for constant + primitive is a different matter.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21399#discussion_r1792328733
More information about the core-libs-dev
mailing list