RFR: 8352075: Perf regression accessing fields [v20]

Coleen Phillimore coleenp at openjdk.org
Thu Jun 5 20:40:58 UTC 2025


On Tue, 3 Jun 2025 05:51:38 GMT, Radim Vansa <rvansa at openjdk.org> wrote:

>> Can you explain somewhere how fields are mapped to this?  I assume they're sorted, for some reason I expected the packed table to be {name-cp-index, sig-cp-index, offset-in-fieldstream-for-direct-access}.  Does every field get 4 ints ?  So why is it packed into ```Array<u1>``` rather than just use ```Array<u4>```?  So much packing code that I don't know how anyone could ever debug it.
>
> Yes, in practice these all are of the same size, but in case of the masks (as well as in case of arguments in API) I want to stress out that these are 32 bit numbers. The `unsigned int`s are just 'some not too big number'.
> Is there any general guidance on deciding between `unsigned int` (I suppose just `unsigned` is not recommended), `uint32_t` and `u4`?
> 
> I was hoping that the comment on line 68 explains the intended use, but I can be more verbose and document each method. When the packed table is used for fieldinfo, it's { offset-in-fieldstream, index-in-fieldstream }. The Comparator implementation can translate offset-in-fieldstream -> { name, signature } and then do the comparison. The `index-in-fieldstream` is kind of second-class citizen; we need to fill it into `FieldInfo` and it is not encoded in the stream, therefore we need to encode it in the packed table.

Reading further, I see what this mapping is and intentionally generalized.  I guess a comment like, the key and value are sized to represent the maximum value for each and then compacted, or something like that.  But maybe I haven't figured out the packing.  Are they increments of u1, u2 or u4 or something in between?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24847#discussion_r2130268911


More information about the serviceability-dev mailing list