On 23/01/16 20:01, Uwe Schindler wrote:

> It depends how small! If the speed is still somewhere between Java 8
> ByteBuffer performance and the recent Hotspot improvements in Java
> 9, I agree with trying it out. But some volatile memory access on
> every access is a no-go. The code around ByteBufferIndexInput in
> Lucene is the most performance-critical critical code, because on
> every search query or sorting there is all the work happening in
> there (millions of iterations with positional ByteBuffer.get*
> calls). As ByteBuffers are limited to 2 GiB, we also need lots of
> hairy code to work around that limitation!

Yes, I see that code.  It would be helpful if there were a
self-contained but realistic benchmark using that code.  That way,
some simple experiments would allow changes to be measured.

> If you look at ByteBufferIndexInput's code you will see that we
> simply do stuff like trying to read from one bytebuffer and only if
> we catch an BufferUnderflowException we fall back to handling buffer
> switches: Instead of checking bounds on every access, we have
> fallback code only happening on exceptions. E.g. if you are 3 bytes
> before end of one buffer slice and read a long, it will throw
> BufferUnderflow. When this happens the code will fall back to read
> byte by byte from 2 different buffers and reassemble the long):

I'm surprised you don't see painful deoptimization traps when that
happens.  I suppose it's rare enough that you don't care.  There's a
new group of methods in JDK9 called Objects.checkIndex() which are
intended to provide a very efficient way to do bounds checks. It might
be interesting to see if they work well with ByteBufferIndexInput:
that's an important use case.

BTW, does anyone here know why we don't have humongous ByteBuffers
with a long index?

Andrew.

Reply via email to