RFR: 8343188: Investigate ways to simplify MemorySegment::ofBuffer
Ioannis Tsakpinis
duke at openjdk.org
Wed Oct 30 20:42:49 UTC 2024
On Wed, 30 Oct 2024 18:43:45 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:
>> This PR proposes to improve `MemorySegment::ofBuffer` making it more amenable to inlining and generally improving performance.
>>
>> Testing successfully on tier1-3
>
> It would be great if we could find a benchmark where inlining doesn't happen and that causes escape analysis issue. @Spasi do you have anything on that front?
Hey @mcimadamore,
Yes, a simple modification of the original benchmark demonstrates it nicely:
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.*;
import java.lang.foreign.*;
import java.nio.*;
@State(Scope.Benchmark)
public class FFMOfBufferTest {
private ByteBuffer buffer = ByteBuffer
.allocateDirect(0x1000)
.order(ByteOrder.nativeOrder());
@Benchmark
public void ofBuffer(Blackhole bh) {
bh.consume(MemorySegment.ofBuffer(buffer).address());
}
@Benchmark
@Fork(jvmArgsAppend = "-XX:CompileCommand=inline,jdk.internal.foreign.AbstractMemorySegmentImpl::ofBuffer,false")
public void ofBufferInlineFalse(Blackhole bh) {
bh.consume(MemorySegment.ofBuffer(buffer).address());
}
@Benchmark
@Fork(jvmArgsAppend = "-XX:CompileCommand=inline,jdk.internal.foreign.AbstractMemorySegmentImpl::ofBuffer,true")
public void ofBufferInlineTrue(Blackhole bh) {
bh.consume(MemorySegment.ofBuffer(buffer).address());
}
}
Now the `.address()` is consumed instead of the buffer itself. Results on `24-beta+20`:
Benchmark Mode Cnt Score Error Units
FFMOfBufferTest.ofBuffer avgt 3 6,542 ± 3,476 ns/op
FFMOfBufferTest.ofBuffer:gc.alloc.rate avgt 3 10499,839 ± 5496,416 MB/sec
FFMOfBufferTest.ofBuffer:gc.alloc.rate.norm avgt 3 72,000 ± 0,001 B/op
FFMOfBufferTest.ofBuffer:gc.count avgt 3 17,000 counts
FFMOfBufferTest.ofBuffer:gc.time avgt 3 15,000 ms
FFMOfBufferTest.ofBufferInlineFalse avgt 3 6,437 ± 1,909 ns/op
FFMOfBufferTest.ofBufferInlineFalse:gc.alloc.rate avgt 3 10666,676 ± 3133,711 MB/sec
FFMOfBufferTest.ofBufferInlineFalse:gc.alloc.rate.norm avgt 3 72,000 ± 0,001 B/op
FFMOfBufferTest.ofBufferInlineFalse:gc.count avgt 3 17,000 counts
FFMOfBufferTest.ofBufferInlineFalse:gc.time avgt 3 14,000 ms
FFMOfBufferTest.ofBufferInlineTrue avgt 3 0,882 ± 0,507 ns/op
FFMOfBufferTest.ofBufferInlineTrue:gc.alloc.rate avgt 3 2,157 ± 67,949 MB/sec
FFMOfBufferTest.ofBufferInlineTrue:gc.alloc.rate.norm avgt 3 0,002 ± 0,061 B/op
FFMOfBufferTest.ofBufferInlineTrue:gc.count avgt 3 ≈ 0 counts
-------------
PR Comment: https://git.openjdk.org/jdk/pull/21764#issuecomment-2448325164
More information about the core-libs-dev
mailing list