I'm developing a JNI implementation similar to sun.misc.Unsafe but with extended memory management.
Why are the call times of native methods from sun.misc.Unsafe and from my developed library extremely different?
Some numbers:
sun.misc.Unsafe.getInt(address) takes ~1ns
when my similar method takes ~10ns
Both implementations are quite the same, following the source code of OpenJDK, just returning the variable by pointer. Both are registered in the same manner.
How can I speed up JNI calls? What makes Unsafe performance so special?
Thanks,
Yury/
Java calling C++ (or C) via the "native" keyword is very fast, around 50 clock cycles.
It defines a way for the bytecode that Android compiles from managed code (written in the Java or Kotlin programming languages) to interact with native code (written in C/C++). JNI is vendor-neutral, has support for loading code from dynamic shared libraries, and while cumbersome at times is reasonably efficient.
In software design, the Java Native Interface (JNI) is a foreign function interface programming framework that enables Java code running in a Java virtual machine (JVM) to call and be called by native applications (programs specific to a hardware and operating system platform) and libraries written in other languages ...
If you look for the source of the native methods in the Unsafe class you will find it does not use JNI implementations. Instead, Unsafe methods are inlined as machine code. getInt(long)
for example becomes one machine code instruction.
For this reason, you can't write a JNI method which is as fast as using Unsafe, without changing the JVM so it inlines the machine code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With