Comparing the performance of Panama with JNI, JNA, and JNR - based on Java 21

Michael Zucchi notzed at gmail.com
Sun Mar 26 02:24:47 UTC 2023


Hi guys,

On 25/3/23 07:52, Maurizio Cimadamore wrote:
>
> Hi Glavo,
> that's a very interesting comparison, thank you!
>
> We will look into the C string -> Java string issue. There are 
> probably "tricks" [1] that native strlen does which we could replicate 
> in our Java code (or we could just do a trivial call to strlen :-) ).
>

It's way more than tricks, at least glibc has hand-rolled architecture 
and feature (sseX/avxX/neon/etc) specific assembly versions in addition 
to the inline stuff available at compile time. I was definitely 
surprised when i noticed getUItf8 was doing it's own strlen.

Doing the trivial call to strlen leverages so much development effort 
and technology - and which will continue to be state-of-the-art - so it 
seems silly not to just call it.

> Aso for struct layouts, I think it is a reasonable request - e.g. 
> allow creation of struct layouts which are "padded" correctly. But I 
> think we'd still want to retain the "raw" variant, which might be 
> useful for tools such as jextract.
>

I was always puzzled why it doesn't enforce alignment based on the 
ValueLayout's alignment and automatically calculate the padding 
required.  Even if you override the system ABI via packed or align 
__attribute__'s members still have a natural alignment that can be 
expressed precisely and completely via an appropriate ValueLayout. A C 
compiler _always_ enforces the rules by necessity.

At the moment you can trivially create an illegal structure layout, e.g. 
(JAVA_BYTE, JAVA_LONG).  But the alignment is still enforced anyway when 
you try to create a varhandle from it so being able to create such a 
struct layout is effectively worthless.  And aren't these invalid 
structures the only type of layout that the 'raw' variant allows that a 
'non-raw' one wouldn't?

So I fail to see a scenario where enforcing the alignment of the member 
based on the ValueLayout.bitAlignment() wouldn't always lead to the 
correct behaviour.  And doing so would necessarily automatically 
calculate any padding.  Also ensuring the memorylayout's are valid 
initially could potentially remove some (repeated) checks in other places.

But adding padding is still a very useful feature and still required.  
Mainly to skip members - some members might not be relevant to java, or 
private fields (either by comment or void *), or if you're only 
interested in a few of many members.  Although it would be nice if one 
had a 'withOffset()' call - the gcc plugin i use to determine structure 
offsets provide the bit offset directly so one needs to calculate the 
padding required by *Layout from the offsets - which it then just has to 
recalculate into an offset again anyway.  Presumably jextract has to do 
the same.

I would be nice if the layout api didn't require naming every field to 
be useful, it's just so much metadata which is often never needed and it 
can add up.  But if you don't name your layout's you can't access them 
from java.  One day I intend to compare 'raw' access (e..g 
segment.get(xx, offset) verses using any of the GroupLayout stuff in 
terms of class sizes and performance for some large api (vulkan is the 
obvious one), but I've been afk or playing with other stuff lately and 
somewhat lost track of where i was on that project.

  Z



More information about the panama-dev mailing list