Comparing the performance of Panama with JNI, JNA, and JNR - based on Java 21
Jorn Vernee
jorn.vernee at oracle.com
Mon Mar 27 15:59:12 UTC 2023
Also note that there are potential issues when combining ThreadLocal and
virtual threads, as there might be a very large number of threads,
resulting in a very large number of NativeStack instances (along with
their native memory stacks)
This makes supporting something based on ThreadLocal directly in the JDK
more questionable I think, since it depends on the particular
application whether this will work well, or not.
Jorn
On 27/03/2023 16:29, Maurizio Cimadamore wrote:
>
>
> On 27/03/2023 15:18, Glavo wrote:
>> Another idea related to usability and performance: Can Panama
>> provide a thread-local "native stack" to help users allocate local
>> variables?
>>
>> I have heard from others that LWJGL is using this technology. I also
>> tried to implement it:
>>
>> https://github.com/Glavo/java-ffi-benchmark/blob/main/src/main/java/benchmark/experimental/NativeStack.java
>> <https://urldefense.com/v3/__https://github.com/Glavo/java-ffi-benchmark/blob/main/src/main/java/benchmark/experimental/NativeStack.java__;!!ACWV5N9M2RV99hQ!NGWKauzXDhIIf_DFibMiRXqyafDYTQ6yIYsFfxsvKbUzFcEhN8_U-A1W85dbMIgL3u_r0jcch-NtPT65nYWdXFdzHw$>
>>
>> I ran benchmarks where allocating a small number of local variables
>> was thirty times more efficient than using a confined arena.
>> If Panama can provide such a class, it will be more convenient and
>> faster for users to assign temporary variables.
>
> While the FFM API does not provide anything directly, it is easy to
> build such an arena on top of FFM.
>
> https://github.com/openjdk/panama-foreign/blob/foreign-memaccess%2Babi/test/micro/org/openjdk/bench/java/lang/foreign/StrLenTest.java#L178
>
> The above implementation is slightly simpler than what LWJGL does, but
> it provides a large boost (because it avoids all dynamic allocations).
>
> More advanced implementations which allocate dynamically when out of
> space and then remember said allocation even after a "release" are
> also possible.
>
> While we might add some such allocators in the future, the main
> priority of the FFM API, design-wise, has been to make sure that such
> custom arenas can be defined by developers directly, when and if needed.
>
> And this is indeed the biggest shift from Java 19 (which doesn't allow
> custom arenas) to Java 20. Java 21 just iterates on the API, making it
> a little bit simpler to use again, while retaining the capability of
> defining custom arenas.
>
> Maurizio
>
>>
>> Glavo
>>
>> On Sat, Mar 25, 2023 at 3:07 AM Glavo <zjx001202 at gmail.com> wrote:
>>
>> I have run a series of benchmarks of Panama, JNI, JNA, and JNR
>> based on the latest JDK. Here is its GitHub repository:
>>
>> https://github.com/Glavo/java-ffi-benchmark
>> <https://urldefense.com/v3/__https://github.com/Glavo/java-ffi-benchmark__;!!ACWV5N9M2RV99hQ!NGWKauzXDhIIf_DFibMiRXqyafDYTQ6yIYsFfxsvKbUzFcEhN8_U-A1W85dbMIgL3u_r0jcch-NtPT65nYWm3ZB9qA$>
>>
>> Here I tested the performance of no-ops, accessing structs,
>> string conversions, and callbacks, respectively. I also tried the
>> new isTrivial linker option.
>> I summarized the results in README and charted them.
>>
>> In this email, in addition to sharing the above results, I would
>> also like to talk about several issues I have encountered
>>
>> 1. MemorySegment.getUtf8String is unexpectedly slow
>>
>> Panama is much faster than JNA in most cases, but the
>> operation of converting C strings to Java strings is an
>> exception.
>> I checked the source code of JNA and Panama, and the
>> suspicious difference is that JNA uses strlen from the C
>> standard library, while Panama uses Java loops.
>> Perhaps this method can be optimized.
>>
>>
>> 2. StructLayout must manually specify all padding
>>
>> Can we provide a convenient method for automatically padding
>> between fields based on alignment?
>> The current structLayout method is annoying for situations
>> where you need to manually simulate the layout of a C struct.
>>
>>
>> Glavo
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20230327/4e00e9a4/attachment-0001.htm>
More information about the panama-dev
mailing list