On Fri, 16 Aug 2024 23:16:46 GMT, Shaojin Wen <[email protected]> wrote:
>> src/java.base/share/classes/jdk/internal/constant/MethodTypeDescImpl.java
>> line 125:
>>
>>> 123: int paramCount = 0;
>>> 124: for (int cur = start; cur < end; ) {
>>> 125: int len = ConstantUtils.skipOverFieldSignature(descriptor,
>>> cur, end, false);
>>
>> I recall skipping over signatures is the main reason descriptor parsing is
>> slow. What is the benchmark result if you allocate a buffer array like
>> `short[] offsets = new short[Math.min(end - start, 255)]` or a `BitSet
>> offsets = new BitSet(end - start)`?
>
> Allocating a buffer will slow down, so I used a long, with each 8 bits
> storing a parameter length, which can improve performance when the number of
> parameters is <= 8.
Since we can't have empty descriptors (`len == 0`) you could leave a 0 in the
bits to signify that the parameter is too large to fit and then re-parse it in
the subsequent loop below. Might simplify the control flow a bit (no need for
`largeParm`, maybe possible to merge the 2nd and 3rd loops)
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/20611#discussion_r1720489188