On Thu, 20 Jul 2023 15:49:10 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

>>> > it's likely to introduce non-trivial additional overhead
>>> 
>>> What do you mean? E.g. where would the overhead come from?
>> 
>> You suggested changes stored the ByteBuffer into a field. I measured 
>> throughput with JMH, and it shows that using ByteBuffer like this results in 
>> over 50% drop in throughput.
>
>> 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%.

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

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

Reply via email to