RFR: 8310843: Reimplement ByteArray and ByteArrayLittleEndian with Unsafe [v10]

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Jul 20 16:04:44 UTC 2023


On Thu, 20 Jul 2023 15:55:18 GMT, Glavo <duke at openjdk.org> wrote:

>>> In this result, ByteBuffer is much slower than VarHandle. Am I doing something wrong? What conditions are needed to make the performance of ByteBuffer close to that of Unsafe?
>> 
>> These are some benchmarks we have in the JDK:
>> 
>> Off-heap access:
>> 
>> 
>> Benchmark                       Mode  Cnt  Score   Error  Units
>> LoopOverNonConstant.BB_get      avgt   30  3.837 ± 0.045  ns/op
>> LoopOverNonConstant.unsafe_get  avgt   30  3.425 ± 0.032  ns/op
>> 
>> 
>> On-heap access:
>> 
>> 
>> Benchmark                           (polluteProfile)  Mode  Cnt  Score   Error  Units
>> LoopOverNonConstantHeap.BB_get                 false  avgt   30  3.897 ± 0.055  ns/op
>> LoopOverNonConstantHeap.unsafe_get             false  avgt   30  3.446 ± 0.027  ns/op
>> 
>> 
>> BB is almost on par with unsafe. There's of course an extra bound check which you pay for. These benchmark are almost idential to the one you shared, so not sure what's going on.
>
> @mcimadamore I ran a series of experiments. When `ByteBuffer` is only used as a local variable without escaping, it is very close to `VarHandle`(`Unsafe`). However, any attempt to put the `ByteBuffer` into a field (even a static final field) resulted in the throughput drop of more than 50%.

I just ran your benchmark above - which is similar as I said to the ones we already have in the JDK. Results:

Benchmark                     Mode  Cnt  Score   Error  Units
ByteArray.readByte            avgt   30  3.619 ± 0.051  ns/op
ByteArray.readByteFromBuffer  avgt   30  3.936 ± 0.071  ns/op
ByteArray.readInt             avgt   30  3.653 ± 0.054  ns/op
ByteArray.readIntFromBuffer   avgt   30  3.798 ± 0.019  ns/op
ByteArray.readLong            avgt   30  3.637 ± 0.053  ns/op
ByteArray.readLongFromBuffer  avgt   30  3.922 ± 0.012  ns/op


I don't see 2x slowdown. Which JDK are you using? Which platform?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/14636#discussion_r1269675593


More information about the core-libs-dev mailing list