<p dir="ltr">Thanks Chen, adding static seemed to have had no effect</p>
<br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Sat, Apr 19, 2025, 19:20 Chen Liang <<a href="mailto:chen.l.liang@oracle.com">chen.l.liang@oracle.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<div dir="ltr">
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Hi Tomer,</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Note that VarHandle instances must be constant folded against the code for peak performance, so they must be in static final fields. You left them in instance final fields, which C2 cannot inline because C2 anticipates serialization or reflection to change
 such a field.</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Regards, Chen</div>
<div id="m_-6971946405095230743appendonsend"></div>
<hr style="display:inline-block;width:98%">
<div id="m_-6971946405095230743divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Tomer Zeltzer <<a href="mailto:tomerr90@gmail.com" target="_blank" rel="noreferrer">tomerr90@gmail.com</a>><br>
<b>Sent:</b> Saturday, April 19, 2025 11:09 AM<br>
<b>To:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com" target="_blank" rel="noreferrer">chen.l.liang@oracle.com</a>><br>
<b>Cc:</b> <a href="mailto:panama-dev@openjdk.org" target="_blank" rel="noreferrer">panama-dev@openjdk.org</a> <<a href="mailto:panama-dev@openjdk.org" target="_blank" rel="noreferrer">panama-dev@openjdk.org</a>><br>
<b>Subject:</b> Re: [External] : Re: Potential performance regression with FFM compared to Unsafe</font>
<div> </div>
</div>
<div>
<p dir="ltr">Tried <a href="https://urldefense.com/v3/__http://pastebin.com/YvE02tgj__;!!ACWV5N9M2RV99hQ!Lp9Z_ABo_ogsHtdpwsnqbBeJyc_nOsHgZFCLI4l4oKNnqsQv_20S6HlySX4DwuZSYf2Tx-oSImhYXBy4T5o$" target="_blank" rel="noreferrer">
pastebin.com/YvE02tgj</a>, its like 100x slower</p>
<br>
<div>
<div dir="ltr">On Sat, Apr 19, 2025, 01:35 Chen Liang <<a href="mailto:chen.l.liang@oracle.com" target="_blank" rel="noreferrer">chen.l.liang@oracle.com</a>> wrote:<br>
</div>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Hi Tomer,</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Note that your way of accessing the layout might not be the best; our recommended way of element access is to construct a larger layout (like a group layout representing a struct), and then obtain var handles with varHandle(PathElement). These var handles perform
 the same access checks, and these duplicate checks might be merged into one by the JIT compiler; such is called "loop hoisting" and is seen in JDK benchmarks. I haven't got time to try this out on your benchmarks yet, but I hope this might be able to address
 some of the regressions you have observed.</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
In addition, for particular structs, we are planning record and interface mappers; record mappers perform a single read to copy native data to immutable objects, while interface mappers are more memory efficient and lazy, but can suffer from memory tearing
 issues. Those might be useful for the different scenarios you have mentioned as well.</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Chen</div>
<div id="m_-6971946405095230743x_m_-5991900381772991912appendonsend"></div>
<hr style="display:inline-block;width:98%">
<div id="m_-6971946405095230743x_m_-5991900381772991912divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Tomer Zeltzer <<a href="mailto:tomerr90@gmail.com" rel="noreferrer noreferrer" target="_blank">tomerr90@gmail.com</a>><br>
<b>Sent:</b> Friday, April 18, 2025 4:45 PM<br>
<b>To:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com" rel="noreferrer noreferrer" target="_blank">chen.l.liang@oracle.com</a>><br>
<b>Cc:</b> <a href="mailto:panama-dev@openjdk.org" rel="noreferrer noreferrer" target="_blank">
panama-dev@openjdk.org</a> <<a href="mailto:panama-dev@openjdk.org" rel="noreferrer noreferrer" target="_blank">panama-dev@openjdk.org</a>><br>
<b>Subject:</b> [External] : Re: Potential performance regression with FFM compared to Unsafe</font>
<div> </div>
</div>
<div>
<p dir="ltr">Thank you for testing this out Chen!<br>
A number of other people were able to reproduce the on heap results so not sure what to say here but thats the less important conclusion I think.<br>
For off heap, having the memory segment as a final field sounds like something that can be relevant for a very few niche use cases, if at all...<br>
If this cant be optimized further, without the final, this means a significant performance hit for a lot of use cases... off the top of my head, libraries like zstd and gzip that do jni bindings</p>
<br>
<div>
<div dir="ltr">On Fri, Apr 18, 2025, 01:17 Chen Liang <<a href="mailto:chen.l.liang@oracle.com" rel="noreferrer noreferrer" target="_blank">chen.l.liang@oracle.com</a>> wrote:<br>
</div>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Hello, I think the observed performance difference is probably due to the heap array being static final. I tested on latest mainline, and ffm is consistently slower without a static final object that it can constant fold against: it exhibited similar performance
 for auto arena 100 vs byte array 100, both having a significant overhead compared to Unsafe, unless the byte array is a constant (in a static final field). Meanwhile, I cannot reproduce FFM being faster than Unsafe for heap access: in the best case FFM is
 still slightly slower than Unsafe.</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
For context, I used the source code at <a href="https://urldefense.com/v3/__https://github.com/tomerr90/UnsafeVSFMA/blob/main/src/main/java/org/example/FMASerDe.java__;!!ACWV5N9M2RV99hQ!Lxvv0mXLndq2JUXA3nMUEyn-744ytcvs5eJAjifpuCqRoGtqtYNwPrN8QnhNzqGoP2hkW7qBYd1IkVXpAIs$" rel="noreferrer noreferrer noreferrer" target="_blank">
https://github.com/tomerr90/UnsafeVSFMA/blob/main/src/main/java/org/example/FMASerDe.java</a> and edited around. I recommend testing against 22 or later releases where FFM has finalized; the preview feature on 21 is no longer maintained.</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:"Calibri Light","Helvetica Light",sans-serif;font-size:12pt;color:rgb(0,0,0)">
Regards, Chen Liang</div>
<div id="m_-6971946405095230743x_m_-5991900381772991912x_m_3079841704662508623appendonsend"></div>
<hr style="display:inline-block;width:98%">
<div id="m_-6971946405095230743x_m_-5991900381772991912x_m_3079841704662508623divRplyFwdMsg" dir="ltr">
<font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> panama-dev <<a href="mailto:panama-dev-retn@openjdk.org" rel="noreferrer noreferrer noreferrer" target="_blank">panama-dev-retn@openjdk.org</a>> on behalf of Tomer Zeltzer <<a href="mailto:tomerr90@gmail.com" rel="noreferrer noreferrer noreferrer" target="_blank">tomerr90@gmail.com</a>><br>
<b>Sent:</b> Thursday, April 17, 2025 6:31 AM<br>
<b>To:</b> <a href="mailto:panama-dev@openjdk.org" rel="noreferrer noreferrer noreferrer" target="_blank">
panama-dev@openjdk.org</a> <<a href="mailto:panama-dev@openjdk.org" rel="noreferrer noreferrer noreferrer" target="_blank">panama-dev@openjdk.org</a>><br>
<b>Subject:</b> Potential performance regression with FFM compared to Unsafe</font>
<div> </div>
</div>
<div>
<div dir="auto">Hey all!
<div dir="auto">First time emailing such a list so apologies if somwthing is "off protocol".</div>
<div dir="auto">I wrote the following article where I benchmarked FFM and Unsafe in JDK21</div>
<div dir="auto"><a href="https://urldefense.com/v3/__https://itnext.io/javas-new-fma-renaissance-or-decay-372a2aee5f32__;!!ACWV5N9M2RV99hQ!Lxvv0mXLndq2JUXA3nMUEyn-744ytcvs5eJAjifpuCqRoGtqtYNwPrN8QnhNzqGoP2hkW7qBYd1IekAyXVw$" rel="noreferrer noreferrer noreferrer" target="_blank">https://itnext.io/javas-new-fma-renaissance-or-decay-372a2aee5f32</a></div>
<div dir="auto"><br>
</div>
<div dir="auto">Conclusions were that FFM was 42% faster for on heap accesses while 67% slower for off heap, which is a bit weird.</div>
<div dir="auto">Code is also linked in the article.</div>
<div dir="auto">Would love hearing your thoughts!</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>

</blockquote></div>