RFR: 8357289: Break down the String constructor into smaller methods

Shaojin Wen swen at openjdk.org
Tue May 20 01:01:31 UTC 2025


On Sun, 18 May 2025 12:48:07 GMT, Shaojin Wen <swen at openjdk.org> wrote:

> Through JVM Option +PrintInlining, we found that String has a constructor codeSize of 852, which is too large. This caused failed to inline.
> 
> The following is the output information of PrintInlining:
> 
>                 @ 9   java.lang.String::<init> (12 bytes)   inline (hot)
> !m                 @ 1   java.nio.charset.Charset::defaultCharset (52 bytes)   inline (hot)
> !                  @ 8   java.lang.String::<init> (852 bytes)   failed to inline: hot method too big
> 
> 
> In Java code, the big method that cannot be inlined is the following constructor
> 
> 
> String(Charset charset, byte[] bytes, int offset, int length) {}
> 
> The above String constructor is too large; break it down into smaller methods with a codeSize under 325 to allow them to be inlined by the C2.

Below are the performance numbers on the MacBook M1 Max. The numbers show that after the small split method, the performance has been significantly improved.


-# master 6c42856b8d5
-Benchmark                                                  (size)  Mode  Cnt   Score   Error  Units
-StringConstructor.newStringFromBytes                            7  avgt   15   6.628 ± 0.048  ns/op
-StringConstructor.newStringFromBytes                           64  avgt   15  10.182 ± 0.079  ns/op
-StringConstructor.newStringFromBytesRanged                      7  avgt   15  10.187 ± 0.871  ns/op
-StringConstructor.newStringFromBytesRanged                     64  avgt   15  11.304 ± 0.111  ns/op
-StringConstructor.newStringFromBytesRangedWithCharsetUTF8       7  avgt   15  10.869 ± 0.753  ns/op
-StringConstructor.newStringFromBytesRangedWithCharsetUTF8      64  avgt   15  11.348 ± 0.134  ns/op
-StringConstructor.newStringFromBytesWithCharsetNameUTF8         7  avgt   15   9.483 ± 0.119  ns/op
-StringConstructor.newStringFromBytesWithCharsetNameUTF8        64  avgt   15  12.755 ± 0.089  ns/op
-StringConstructor.newStringFromBytesWithCharsetUTF8             7  avgt   15   6.721 ± 0.107  ns/op
-StringConstructor.newStringFromBytesWithCharsetUTF8            64  avgt   15  10.208 ± 0.065  ns/op


+# current 4ebac0ddc64
+Benchmark                                                  (size)  Mode  Cnt   Score   Error  Units
+StringConstructor.newStringFromBytes                            7  avgt   15   4.715 ± 0.029  ns/op +40.57%
+StringConstructor.newStringFromBytes                           64  avgt   15   8.019 ± 0.152  ns/op +26.97%
+StringConstructor.newStringFromBytesRanged                      7  avgt   15   5.563 ± 0.059  ns/op +83.12%
+StringConstructor.newStringFromBytesRanged                     64  avgt   15   9.549 ± 0.217  ns/op +18.37%
+StringConstructor.newStringFromBytesRangedWithCharsetUTF8       7  avgt   15   5.579 ± 0.076  ns/op +94.81%
+StringConstructor.newStringFromBytesRangedWithCharsetUTF8      64  avgt   15   9.407 ± 0.047  ns/op +20.63%
+StringConstructor.newStringFromBytesWithCharsetNameUTF8         7  avgt   15   8.168 ± 0.084  ns/op +16.09%
+StringConstructor.newStringFromBytesWithCharsetNameUTF8        64  avgt   15  12.574 ± 0.268  ns/op + 1.43%
+StringConstructor.newStringFromBytesWithCharsetUTF8             7  avgt   15   4.722 ± 0.043  ns/op +42.33%
+StringConstructor.newStringFromBytesWithCharsetUTF8            64  avgt   15   8.077 ± 0.144  ns/op +26.38%

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

PR Comment: https://git.openjdk.org/jdk/pull/25290#issuecomment-2889044580


More information about the core-libs-dev mailing list