RFR: 8336856: Optimize String Concat [v10]

Shaojin Wen duke at openjdk.org
Wed Jul 24 10:23:35 UTC 2024


On Wed, 24 Jul 2024 10:18:03 GMT, Shaojin Wen <duke at openjdk.org> wrote:

>> The current implementation of StringConcat is to mix the coder and length into a long. This operation will have some overhead for int/long/boolean types. We can separate the calculation of the coder from the calculation of the length, which can improve the performance in the scenario of concat int/long/boolean.
>> 
>> This idea comes from the suggestion of @l4es in the discussion of PR https://github.com/openjdk/jdk/pull/20253#issuecomment-2240412866
>
> Shaojin Wen has updated the pull request incrementally with ten additional commits since the last revision:
> 
>  - minor refactor
>  - minor refactor
>  - reduce change
>  - copyright
>  - reduce change
>  - refactor based on 8335182
>  - use Float.toString & Double.toString
>  - remove ForceInline
>  - fix build error

Now, the implementation algorithm is the same as the MH-based implementation. The difference is that the original implementation was based on MethodHandle, but now it is based on bytecode-spinning, so no additional changes are required to StringConatHelper, and the performance is the same.


- MH-based
-@ 8   java.lang.invoke.LambdaForm$MH/0x00000800000d5000::linkToTargetMethod (10 bytes)   force inline by annotation
-  @ 6   java.lang.invoke.LambdaForm$MH/0x00000800000d4800::invoke (80 bytes)   force inline by annotation
-    @ 16   java.lang.invoke.LambdaForm$MH/0x00000800000d4000::invoke (46 bytes)   force inline by annotation
-      @ 23   java.lang.invoke.LambdaForm$BMH/0x00000800000d2c00::reinvoke (20 bytes)   force inline by annotation
-        @ 16   java.lang.invoke.LambdaForm$DMH/0x00000800000d2400::invokeStatic (17 bytes)   force inline by annotation
-          @ 1   java.lang.invoke.DirectMethodHandle::internalMemberName (8 bytes)   force inline by annotation

+ bytecode-spinning
+@ 8   java.lang.invoke.LambdaForm$MH/0x00000ff8000cd800::linkToTargetMethod (10 bytes)   force inline by annotation
+  @ 6   java.lang.invoke.LambdaForm$DMH/0x00000ff8000cd000::invokeStatic (15 bytes)   force inline by annotation
+    @ 1   java.lang.invoke.DirectMethodHandle::internalMemberName (8 bytes)   force inline by annotation


Based on bytecode-spinning, some intermediate classes will be generated less, which should improve the startup time, but how to analyze the startup time? Can anyone help?

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

PR Comment: https://git.openjdk.org/jdk/pull/20273#issuecomment-2247517412


More information about the core-libs-dev mailing list