I wanted to share a follow-up to this post. https://bluuewhale.github.io/posts/further-optimizing-my-jav...
This time I went back with a profiler and optimized the actual hot path.
A huge chunk of time was going to Objects.equals() because of profile pollution / missed devirtualization.
After fixing that, the next bottleneck was ARM/NEON “movemask” pain (VectorMask.toLong()), so I tried SWAR… and it ended up faster (even on x86, which I did not expect).