> 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 three additional commits since the last revision: - shift api boundary - move bench - revert formatting ------------- Changes: - all: https://git.openjdk.org/jdk/pull/23142/files - new: https://git.openjdk.org/jdk/pull/23142/files/35a3a156..4f8a9a97 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=23142&range=02 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=23142&range=01-02 Stats: 343 lines in 8 files changed: 183 ins; 138 del; 22 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