> Certain signatures for foreign function calls (e.g. HVA return by value) 
> require allocation of an intermediate buffer to adapt the FFM's to the native 
> stub's calling convention. In the current implementation, this buffer is 
> malloced and freed on every FFM invocation, a non-negligible overhead.
> 
> Sample stack trace:
> 
>    java.lang.Thread.State: RUNNABLE
>       at jdk.internal.misc.Unsafe.allocateMemory0(java.base@25-ea/Native 
> Method)
> ...
>       at 
> jdk.internal.foreign.abi.SharedUtils.newBoundedArena(java.base@25-ea/SharedUtils.java:386)
>       at 
> jdk.internal.foreign.abi.DowncallStub/0x000001f001084c00.invoke(java.base@25-ea/Unknown
>  Source)
> ...
>       at 
> java.lang.invoke.Invokers$Holder.invokeExact_MT(java.base@25-ea/Invokers$Holder)
> 
> 
> To alleviate this, this PR remembers and reuses up to two small intermediate 
> buffers per carrier-thread in subsequent calls.
> 
> Performance (MBA M3):
> 
> 
> master@764d70b7df18e288582e616c62b0d7078f1ff3aa
> Benchmark                         Mode  Cnt    Score    Error  Units
> PointsAlloc.circle_by_ptr         avgt   30    9.197 ?  0.037  ns/op
> PointsAlloc.circle_by_value       avgt   30   42.195 ?  0.088  ns/op   <= 
> #######
> PointsAlloc.jni_ByteBuffer_alloc  avgt   30  226.127 ? 35.378  ns/op
> PointsAlloc.jni_long_alloc        avgt   30   25.297 ?  2.457  ns/op
> PointsAlloc.panama_alloc          avgt   30   27.053 ?  1.915  ns/op
> 
> After:
> Benchmark                         Mode  Cnt    Score    Error  Units
> PointsAlloc.circle_by_ptr         avgt   30    9.156 ?  0.021  ns/op
> PointsAlloc.circle_by_value       avgt   30   11.995 ?  0.051  ns/op   <= 
> #######
> PointsAlloc.jni_ByteBuffer_alloc  avgt   30  211.161 ? 23.284  ns/op
> PointsAlloc.jni_long_alloc        avgt   30   24.885 ?  2.461  ns/op
> PointsAlloc.panama_alloc          avgt   30   26.905 ?  1.935  ns/op
> 
> 
> `-prof gc` also shows that the new call path is fully scalar-replaced vs 160 
> byte/call before.

Matthias Ernst has updated the pull request incrementally with one additional 
commit since the last revision:

  reduce visibility

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/23142/files
  - new: https://git.openjdk.org/jdk/pull/23142/files/4f8a9a97..0023eb45

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=23142&range=03
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=23142&range=02-03

  Stats: 36 lines in 2 files changed: 2 ins; 18 del; 16 mod
  Patch: https://git.openjdk.org/jdk/pull/23142.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/23142/head:pull/23142

PR: https://git.openjdk.org/jdk/pull/23142

Reply via email to