use of Unsafe for ASCII detection
Andrew Haley
aph at redhat.com
Thu Jan 7 11:54:03 UTC 2016
On 07/01/16 10:04, Andrew Haley wrote:
> If you allocate a temp ByteBuffer object carefully so that it does not
> escape, it will be removed and you should get the same code as
> directly using Unsafe. I certainly tested it during the work on
> Unsafe.getXXUnaligned and it was the same. I'll have a look at your
> example.
I tried your test.
The ByteBuffer allocation is not being removed because it's not inlined:
@ 1 java.nio.ByteBuffer::wrap (8 bytes)
@ 4 java.nio.ByteBuffer::wrap (20 bytes)
@ 7 java.nio.HeapByteBuffer::<init> (14 bytes)
@ 10 java.nio.ByteBuffer::<init> (45 bytes) callee is too large
Oops: we're really missing a trick. So, I'll try to increase the
inline limit so that it's big enough to inline everything: I set it to
100 with -XX:MaxInlineSize=100 .
The other thing is that you're doing a lot of byte-reversing because
ByteBuffer.getLong() is always big-endian. Do this:
ByteBuffer b = ByteBuffer.wrap(bytes).order(ByteOrder.nativeOrder());
I get:
Unsafe stride 8: 0.22454525012941629
Buffer stride 8: 0.22788670497576385
Buffer stride 1: 1.0007217052423052
Yippee! :-)
There are some lessons to be learned here. We really should try to
inline ByteBuffer constructors to give escape analysis a chance. And
if you want buffers in native byte order you have to ask for them.
And finally, wrapped ByteBuffers can be a perfectly good substitute for
Unsafe access to byte arrays.
Andrew.
More information about the core-libs-dev
mailing list