On Fri, 26 Apr 2024 11:51:51 GMT, Claes Redestad <[email protected]> wrote:
>> This PR makes ClassDesc.ofDescriptor return the shared constant for
>> primitive descriptor strings ("I" etc..), and leverages this further by
>> refactoring `MethodTypeDescImpl.ofDescriptor` to avoid the intermediate
>> substring for primitives.
>>
>> Microbenchmarks results look good with expected speedups and allocation
>> reductions any time a primitive is part of the descriptor string, and a
>> non-significant cost otherwise:
>>
>>
>> Name
>> (descString) Cnt Base Error Test Error Unit Change
>> ClassDescFactories.ofDescriptor
>> Ljava/lang/Object; 6 13,941 ± 1,643 14,071 ± 1,333 ns/op
>> 0,99x (p = 0,681 )
>> :gc.alloc.rate.norm
>> 16,000 ± 0,000 16,000 ± 0,000 B/op 1,00x (p = 0,617 )
>> ClassDescFactories.ofDescriptor
>> V 6 9,212 ± 1,045 1,405 ± 0,049 ns/op 6,55x (p = 0,000*)
>> :gc.alloc.rate.norm
>> 48,000 ± 0,000 0,000 ± 0,000 B/op 0,00x (p = 0,000*)
>> ClassDescFactories.ofDescriptor
>> I 6 9,009 ± 0,035 1,431 ± 0,192 ns/op 6,30x (p = 0,000*)
>> :gc.alloc.rate.norm
>> 48,000 ± 0,000 0,000 ± 0,000 B/op 0,00x (p = 0,000*)
>> MethodTypeDescFactories.ofDescriptor
>> (Ljava/lang/Object;Ljava/lang/String;)I 6 182,050 ± 4,333 141,644 ±
>> 2,685 ns/op 1,29x (p = 0,000*)
>> :gc.alloc.rate.norm
>> 360,001 ± 0,000 264,001 ± 0,000 B/op 0,73x (p = 0,000*)
>> MethodTypeDescFactories.ofDescriptor
>> ()V 6 17,169 ± 2,008 9,915 ± 0,018 ns/op 1,73x (p = 0,000*)
>> :gc.alloc.rate.norm
>> 120,000 ± 0,000 104,000 ± 0,000 B/op 0,87x (p = 0,000*)
>> MethodTypeDescFactories.ofDescriptor
>> ([IJLjava/lang/String;Z)Ljava/util/List; 6 270,372 ± 3,624 217,050 ±
>> 3,170 ns/op 1,25x (p = 0,000*)
>> :gc.alloc.rate.norm
>> 520,002 ± 0,000 328,001 ± 0,000 B/op 0,63x (p = 0,000*)
>> MethodTypeDescFactories.ofDescriptor
>> ()[Ljava/lang/String; 6 35,036 ± 0,351 36...
>
> Claes Redestad has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Copyrights and other comments from @JornVernee
Changes requested by liach (Author).
src/java.base/share/classes/java/lang/constant/ClassDesc.java line 163:
> 161: // implicit null-check
> 162: return (descriptor.length() == 1)
> 163: ?
> Wrapper.forPrimitiveType(descriptor.charAt(0)).primitiveClassDescriptor()
Wait a second, it seems `ClassDesc.ofDescriptor("L")` will return
`ConstantDescs.CD_Object` now. Might be good to have a test to verify this
doesn't happen.
-------------
PR Review: https://git.openjdk.org/jdk/pull/18971#pullrequestreview-2024985611
PR Review Comment: https://git.openjdk.org/jdk/pull/18971#discussion_r1580996421