<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p><br>
</p>
<div class="moz-cite-prefix">On 27/03/2023 15:18, Glavo wrote:<br>
</div>
<blockquote type="cite" cite="mid:CAJL5A3=e5pbzgqbQs4ULbCn_P1QwdWO5Axqmyu7st=tJ9qgU4Q@mail.gmail.com">
<div dir="ltr">Another idea related to usability and performance:
Can Panama provide a thread-local "native stack" to help users
allocate local variables?
<div><br>
</div>
<div>I have heard from others that LWJGL is using this
technology. I also tried to implement it:</div>
<div><br>
</div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><a href="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$" moz-do-not-send="true">https://github.com/Glavo/java-ffi-benchmark/blob/main/src/main/java/benchmark/experimental/NativeStack.java</a></div>
<div><br>
</div>
</blockquote>
<div>
<div>
<div>I ran benchmarks where allocating a small number of
local variables was thirty times more efficient than using
a confined arena.<br>
</div>
<div>If Panama can provide such a class, it will be more
convenient and faster for users to assign temporary
variables.</div>
</div>
</div>
</div>
</blockquote>
<p>While the FFM API does not provide anything directly, it is easy
to build such an arena on top of FFM.</p>
<p><a class="moz-txt-link-freetext" href="https://github.com/openjdk/panama-foreign/blob/foreign-memaccess%2Babi/test/micro/org/openjdk/bench/java/lang/foreign/StrLenTest.java#L178">https://github.com/openjdk/panama-foreign/blob/foreign-memaccess%2Babi/test/micro/org/openjdk/bench/java/lang/foreign/StrLenTest.java#L178</a></p>
<p>The above implementation is slightly simpler than what LWJGL
does, but it provides a large boost (because it avoids all dynamic
allocations).</p>
<p>More advanced implementations which allocate dynamically when out
of space and then remember said allocation even after a "release"
are also possible.</p>
<p>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.</p>
<p>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.</p>
<p>Maurizio<br>
</p>
<blockquote type="cite" cite="mid:CAJL5A3=e5pbzgqbQs4ULbCn_P1QwdWO5Axqmyu7st=tJ9qgU4Q@mail.gmail.com">
<div dir="ltr">
<div>
<div>
<div><br>
</div>
<div>Glavo</div>
</div>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Sat, Mar 25, 2023 at
3:07 AM Glavo <<a href="mailto:zjx001202@gmail.com" moz-do-not-send="true" class="moz-txt-link-freetext">zjx001202@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">I have run a series of benchmarks of Panama,
JNI, JNA, and JNR based on the latest JDK. Here is its
GitHub repository:<br>
<div><br>
</div>
<div> <a href="https://urldefense.com/v3/__https://github.com/Glavo/java-ffi-benchmark__;!!ACWV5N9M2RV99hQ!NGWKauzXDhIIf_DFibMiRXqyafDYTQ6yIYsFfxsvKbUzFcEhN8_U-A1W85dbMIgL3u_r0jcch-NtPT65nYWm3ZB9qA$" target="_blank" moz-do-not-send="true">https://github.com/Glavo/java-ffi-benchmark</a></div>
<div><br>
</div>
<div>Here I tested the performance of no-ops, accessing
structs, string conversions, and callbacks, respectively.
I also tried the new isTrivial linker option.</div>
<div>I summarized the results in README and charted them.<br>
</div>
<div><br>
</div>
<div>In this email, in addition to sharing the above
results, I would also like to talk about several issues I
have encountered<br>
</div>
<div><br>
</div>
<div>1. MemorySegment.getUtf8String is unexpectedly slow</div>
<div><br>
</div>
<blockquote style="margin:0px 0px 0px
40px;border:none;padding:0px">
<div>Panama is much faster than JNA in most cases, but the
operation of converting C strings to Java strings is an
exception.</div>
<div>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. </div>
<div>Perhaps this method can be optimized.</div>
</blockquote>
<div><br>
</div>
<div>2. StructLayout must manually specify all padding</div>
<div><br>
</div>
<blockquote style="margin:0px 0px 0px
40px;border:none;padding:0px">
<div>Can we provide a convenient method for automatically
padding between fields based on alignment?</div>
<div>The current structLayout method is annoying for
situations where you need to manually simulate the
layout of a C struct.</div>
</blockquote>
<div><br>
</div>
<div>Glavo</div>
</div>
</blockquote>
</div>
</blockquote>
</body>
</html>