RFR: 8331744: java.lang.classfile.TypeKind improvements

Claes Redestad redestad at openjdk.org
Mon May 6 22:02:52 UTC 2024


On Mon, 6 May 2024 20:48:05 GMT, Chen Liang <liach at openjdk.org> wrote:

> A peek into TypeKind during the research for #19105 reveals that TypeKind has a few issues:
> 1. Name mismatch for `newarraycode` and `fromNewArrayCode`: Renamed both to use "newarray code"
> 2. `fromDescriptor` can throw IOOBE if the input string is empty: changed to throw IAE and added tests.
> 3. `from(Class)` can be slow due to descriptor computation: added benchmark, will share result in next comment (as it may change with code changes).
> 
> The first 2 changes involves API changes, and a CSR has been created. Requesting @asotona for a review.

Leaning on `TypeDescriptor.OfField::isPrimitive` presents an opportunity: override `isPrimitive` in `PrimitiveClassDescImpl` and `ReferenceClassDescImpl` to return `true` and `false` respectively: 


Name                            (type) Cnt    Base    Error     Test    Error  Unit  Change
TypeKindBench.fromClassDescs PRIMITIVE   6 199,765 ±  3,370  205,531 ±  2,632 ns/op   0,97x (p = 0,000*)
TypeKindBench.fromClassDescs REFERENCE   6  75,018 ±  1,113   25,925 ±  1,145 ns/op   2,89x (p = 0,000*)
TypeKindBench.fromClasses    PRIMITIVE   6 344,477 ± 46,310  366,135 ± 54,955 ns/op   0,94x (p = 0,066 )
TypeKindBench.fromClasses    REFERENCE   6  23,338 ±  0,467   23,183 ±  1,357 ns/op   1,01x (p = 0,484 )
  * = significant


Interestingly this has a tiny regression for the primitive case - in this micro. Probably an effect of the default `descriptor.length() == 1` implementation acting as a sort of prefetch the value we'll switch on (`descriptor.charAt(0)`) down this path. Only overriding for `ReferenceClassDescImpl` is neutral, but maybe that's overfitting:


Name                            (type) Cnt    Base    Error     Test    Error  Unit  Change
TypeKindBench.fromClassDescs PRIMITIVE   6 199,765 ±  3,370  196,203 ±  2,469 ns/op   1,02x (p = 0,000*)
TypeKindBench.fromClassDescs REFERENCE   6  75,018 ±  1,113   25,311 ±  0,138 ns/op   2,96x (p = 0,000*)
TypeKindBench.fromClasses    PRIMITIVE   6 344,477 ± 46,310  325,336 ± 12,203 ns/op   1,06x (p = 0,035 )
TypeKindBench.fromClasses    REFERENCE   6  23,338 ±  0,467   23,462 ±  3,239 ns/op   0,99x (p = 0,805 )
  * = significant

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

PR Comment: https://git.openjdk.org/jdk/pull/19109#issuecomment-2096996186


More information about the core-libs-dev mailing list