On Mon, 19 Aug 2024 00:20:40 GMT, Chen Liang <li...@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.
>
> 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

Reply via email to