On Fri, 30 May 2025 21:14:53 GMT, John R Rose <jr...@openjdk.org> wrote:
>> Radim Vansa has refreshed the contents of this pull request, and previous >> commits have been removed. Incremental views are not available. > >> I like the idea of mapping each element in the table as raw bits, though >> handling of access to the end of the array would be a bit inconvenient (or >> we would have to allocate a few extra bytes). > > The code snippet I shared above shows a better way: You load a full 8 (or 4) > bytes where the END (not the START) of the word lines up with the LAST (not > FIRST) byte. Then you will never run past the end of the array! So, fine, > but what about the start of the array? Well, it's inside an `Array<u1>` > object, which has a length header, which is guaranteed to be safe to load > (under a cast or bytewise or whatever). Problem solved. The only thing to > avoid is to load an 8-byte word when the packed word size is 1..5 bytes; then > you load a 4-byte word. You can load both components at once, and then use a > configurable shift (from one machine word) to separate them. This is why I > say it saves a half-byte on average. > > These tweaky ideas have three effects: They probably make the code a little > simpler (or at least no worse), they reduce the number of memory operations > to query a packed array, and they probably use fewer ALU instructions > overall. They are certainly worth considering for the general-purpose > "searchable packed array" I am envisioning; they are optional for this > particular bug, viewed in isolation. > >> I've changed the algorithm to use unsigned integers; in fact I find a bit >> annoying that most of the indices used throughout the related code are >> signed. > > Yes, it annoys me also. It's playing with fire (or walking the firepit). > >> I've also added a test generating class with a different number of fields, >> though running it through the full range of fields (0-65535, though in >> practice the upper bound is rather 26k) would be excessive; even now it >> takes more than a minute on my machine. Also, I realize that varying the >> number of fields does not result in full coverage of possible stream sizes; >> per-field records have probably rather uniform lengths. > > Yeah, a gtest on the binary search would cover most of those issues, faster > and cleaner. Then loading many gigantic classfiles will be unnecessary. > Just a few classfiles at several scales, probably, and thorough gtest-level > unit testing, gets a better result in less time. As I said above, I'm > willing to put off some of the refactoring, given that it should cover other, > prior occurrences of binary search (so it's got a larger scope than this bug). > >> @rose00 OK, so I have refactored out the PackedTable that now h... @rose00 Hi, would you be OK with the current implementation? ------------- PR Comment: https://git.openjdk.org/jdk/pull/24847#issuecomment-2939915008