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/
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.
来源:https://stackoverflow.com/questions/7823665/why-are-jni-calls-to-native-methods-slower-than-similar-methods-in-sun-misc-unsa