On Mon, 19 Aug 2024 00:20:40 GMT, Chen Liang <[email protected]> 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.
>
> src/java.base/share/classes/jdk/internal/constant/ConstantUtils.java line 296:
>
>> 294: // objectDesc appears a lot during the bootstrap process, so
>> optimize it
>> 295: String objectDesc = "Ljava/lang/Object;";
>> 296: if (len == objectDesc.length() &&
>> descriptor.regionMatches(start, objectDesc, 0, len)) {
>
> Note that from my bytestack investigations, `regionMatches` can be
> CPU-intensive like hashCode calculation. Running this trick against
> `Ljava/lang/String;` (same length) might cause a lot of misses and waste a
> lot of CPU time. Can you try on a case with many `Ljava/lang/String;`
> descriptors and see the results compared to the build without this special
> case?
Also `Double` `Module` `Number` `Record` `Thread` `System` are susceptible to
taking more time in `regionMatches`.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/20611#discussion_r1721104536