[External] : Re: Feedback / query on jextract for Windows 10

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Jan 26 16:54:30 UTC 2021


I'll take a look with the latest version - it might be that something is 
interacting with the lazy constant loading process.

Thanks for reporting this - minimizing startup of jextracted libraries 
is a pretty important use case for us.

Cheers
Maurizio

On 26/01/2021 15:43, Duncan Gittins wrote:
> I don't know what causes the speed difference, which may be down to 
> the jar size as you suggest. I'll re-test after the time that 
> "--source" generates same code as seen in the .class files when it may 
> be easier to understand why there is a difference. I am using 
> 16-panama+3-385.
>
> This isn't a very robust test, but I also tried deleted all the 
> un-necessary .class files from the 11MB jextract generated classes 
> (not produced using --source) down to 2MB jar, then I moved my 
> handcoded method into a separate class and added a dependency on a 
> different 2MB jar. Neither of those changes affected the typical 
> speeds of first call times - I still consistently see that the hand 
> coded method handle version of my app is ~300-500ms faster on first 
> call, and no difference for 2nd+ calls.
>
> Duncan
>
> On 25/01/2021 16:18, Maurizio Cimadamore wrote:
>>
>> On 25/01/2021 16:13, Duncan Gittins wrote:
>>> Thanks for the information.  As you suspected that bug must be 
>>> related and there is a minor difference in the --source output 
>>> because the problem does go away when removing the jextract 
>>> "--source" flag and making jar directly from generated classes 
>>> rather than just compiling from the generated source code.
>>>
>>> My code samples using jextract bindings are ~300ms slower at startup 
>>> time (but same speed runtime). I'm not certain if this overhead is 
>>> down to initialisation of static constants or simply to be expected 
>>> when adding 11MB jar footprint (compared to 56k jar for my 
>>> handwritten MH bindings). I will follow-up if I find out more.
>> If you see the startup slowdown even when omitting --source, then the 
>> issue is with loading the jar, rather than initializing - as 
>> explaining no initializing should happen outside for stuff that is 
>> actually used by your code - so I'd expect that initialization 
>> overhead for jextract code and your manually written versions should 
>> be roughly the same.
>>>
>>> Looking at the generated code for "xxx$constants$nn.java" there 
>>> seems to be a degree of unnecessary initialisation per 
>>> xxx$constants$nn class as it contains static variables for 
>>> FunctionDescriptor / MemoryLayout which would be initialised every 
>>> time that particular class was loaded and not used in my code. I 
>>> felt that my own jar was slow starting so switched foreign linker 
>>> references to a lazy load Supplier for every library / symbol / mh / 
>>> vh so that only the referenced types get created.
>>
>> Sure - but that's only when --source is used - when you generated 
>> classes directly, everything is lazy (and in a more general way than 
>> using Suppliers).
>>
>> So, can you please confirm, to be clear, that you still see startup 
>> regression even when NOT using "--source" ?
>>
>> Thanks!
>> Maurizio
>>
>>>
>>> I will have a look at future builds - this project is extremely 
>>> useful so I hope it gets into a full JDK release soon. Unfortunately 
>>> my issue with a huge jar in Eclipse means I can't easily develop 
>>> using the generated code variant right now, but in the meantime the 
>>> jextract code is still very helpful to work out how to call Windows 
>>> APIs correctly.
>>>
>>> Duncan
>>>
>>> On 25/01/2021 10:20, Maurizio Cimadamore wrote:
>>>>
>>>> On 23/01/2021 18:34, Duncan Gittins wrote:
>>>>> I've been using Panama on Windows 10 to eliminate my C# apps which 
>>>>> I would normally call via ProcessBuilder. I'm very impressed so 
>>>>> far and looking forward to newer versions: everything I have 
>>>>> written in Windows C# is now replaced with foreign memory / linker 
>>>>> calls to native code using the latest Java 16 EA.  I have examples 
>>>>> for various Win32 API and COM objects, HWND objects and 
>>>>> screensaver. However I'm struggling to get the code running with 
>>>>> output from jextract build. Perhaps I overlooked something very 
>>>>> obvious in how to setup?
>>>>>
>>>>> One example app is attached - this calls SystemParametersInfoA to 
>>>>> set the Windows desktop background. There are two implementations 
>>>>> of setImage: one with hardwired MethodHandle works fine, but the 
>>>>> jextract version gives UnsupportedOperationException for layout 
>>>>> unrelated to SystemParametersInfoA. If I edit the generated code 
>>>>> to comment out all lines unrelated to SystemParametersInfoA then 
>>>>> both versions of setImage work.
>>>>
>>>> I think the culprit is this:
>>>>
>>>> ```
>>>> Caused by: java.lang.UnsupportedOperationException: Invalid 
>>>> alignment requirements for layout 
>>>> b64(ArbitraryUserPointer)[abi/kind=POINTER,layout/name=ArbitraryUserPointer]
>>>>         at 
>>>> jdk.incubator.foreign/jdk.internal.foreign.LayoutPath.checkAlignment(LayoutPath.java:273)
>>>>         at 
>>>> jdk.incubator.foreign/jdk.internal.foreign.LayoutPath.dereferenceHandle(LayoutPath.java:159)
>>>>         at 
>>>> jdk.incubator.foreign/jdk.incubator.foreign.MemoryLayout.lambda$varHandle$2(MemoryLayout.java:488)
>>>>         at 
>>>> jdk.incubator.foreign/jdk.incubator.foreign.MemoryLayout.computePathOp(MemoryLayout.java:534)
>>>>         at 
>>>> jdk.incubator.foreign/jdk.incubator.foreign.MemoryLayout.varHandle(MemoryLayout.java:488)
>>>>         at 
>>>> duncan.win32.shobjidl_core.shlobj_core_h$constants$16.<clinit>(shlobj_core_h$constants$16.java:1844)
>>>> ```
>>>>
>>>> This seems a duplicate of another issue that has been reported last 
>>>> week:
>>>>
>>>> https://bugs.openjdk.java.net/browse/JDK-8259832
>>>>
>>>> E.g. jextract ignoring alignment requirements. Note that jextract 
>>>> generates lots of constants, and it takes only one bad one to make 
>>>> initialization fail.
>>>>
>>>>>
>>>>> The jextract command on Windows 10 (with fresh Vis Studio 
>>>>> installation) expands shlobj_core.h because I my app also uses 
>>>>> IShellLink.
>>>>>
>>>>>      set "WINKIT=c:\Program Files (x86)\Windows 
>>>>> Kits\10\Include\10.0.18362.0"
>>>>>      jextract --source -t duncan.win32.shobjidl_core -d 
>>>>> shlobj_core.h/java     "%WINKIT%/um/shlobj_core.h"
>>>>>
>>>>> Another issue is that this single windows header file gives rise 
>>>>> to 11MB jar and is unusable inside Eclipse (on my slow PC), and is 
>>>>> slow startup at runtime. Have you considered changing the 
>>>>> generated code to use lazy Supplier<MethodHandle> instead of 
>>>>> MethodHandle to ensure only required handles are created on-demand?
>>>>
>>>> Uhm... we are already using dynamic constants, so you should only 
>>>> pay for the MHs and VHs you use - e.g. in fact I'm even surprised 
>>>> you get the failure inside the <clinit> above - since that constant 
>>>> should not be initialized unless it's used. I wonder if there's a 
>>>> regression here... are you using the `--source` flag? With that 
>>>> flag we revert back to a monolithic header, so that will explain 
>>>> both failures. If so, try removing that flag - and see what happens 
>>>> (if everything is working as it should I don't think you should 
>>>> even see the error above, assuming you never use that layout).
>>>>
>>>> Maurizio
>>>>
>>>>>
>>>>> Kind regards
>>>>>
>>>>> Duncan
>>>>>
>>>>>
>>>
>


More information about the panama-dev mailing list