RFR: 8338532: Speed up the ClassFile API MethodTypeDesc#ofDescriptor [v2]

Claes Redestad redestad at openjdk.org
Tue Aug 20 10:05:59 UTC 2024


On Mon, 19 Aug 2024 23:14:06 GMT, Shaojin Wen <duke at openjdk.org> wrote:

>> The current implementation of ofDescriptor puts return type and parameter types together in an ArrayList, and then splits them into return type and array of parameter types. This ArrayList creation is unnecessary, considering most descriptors only have few parameter types.
>> 
>> By splitting return type and parameter types separately and scanning the descriptor first to get the number of parameters, we can just allocate an exact, trusted array for the resulting MethodTypeDesc without copy.
>
> Shaojin Wen has updated the pull request incrementally with one additional commit since the last revision:
> 
>   less changes with suggestions from @liach

It would seem the specialization for `Ljava/lang/Object;` (via `String::regionMatches`) hurts interpreted performance, putting into doubt whether that optimization is fruitful for startup performance. `-Xint` numbers:

Name                                                        (descString) Cnt       Base      Error        Test       Error  Unit  Change
ofDescriptor                     (Ljava/lang/Object;Ljava/lang/String;)I   6   7734,757 ±  154,894   10463,211 ±    61,369 ns/op   0,74x (p = 0,000*)
ofDescriptor                                                         ()V   6   1346,374 ±   56,956     527,418 ±    54,952 ns/op   2,55x (p = 0,000*)
ofDescriptor    (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;   6   9873,260 ±  118,592   13512,378 ±    44,295 ns/op   0,73x (p = 0,000*)
ofDescriptor    (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;   6   9790,973 ±  196,979   15078,814 ±   154,289 ns/op   0,65x (p = 0,000*)
ofDescriptor (Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;   6   9963,069 ±  126,510    9610,144 ±  1952,719 ns/op   1,04x (p = 0,270 )
ofDescriptor                                        ()Ljava/lang/Object;   6   3730,028 ±  757,223    4314,956 ±   460,108 ns/op   0,86x (p = 0,002*)
ofDescriptor                    ([IJLjava/lang/String;Z)Ljava/util/List;   6   8909,754 ±   93,260    9004,239 ±   917,012 ns/op   0,99x (p = 0,512 )
ofDescriptor                                       ()[Ljava/lang/String;   6   3710,475 ±  171,494    3159,694 ±    67,448 ns/op   1,17x (p = 0,000*)
ofDescriptor                                                    (..IIJ)V   6  18670,031 ±  257,048   17178,329 ±   544,327 ns/op   1,09x (p = 0,000*)
ofDescriptor                                           ([III.Z[B..[.[B).   6  45623,579 ± 8342,076   46138,662 ± 13494,653 ns/op   0,99x (p = 0,829 )
ofDescriptor                                    (.....................).   6 166686,442 ± 3550,565  167529,385 ± 11210,813 ns/op   0,99x (p = 0,640 )
  * = significant

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

PR Comment: https://git.openjdk.org/jdk/pull/20611#issuecomment-2298473472


More information about the core-libs-dev mailing list