Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are JNI calls to native methods slower than similar methods in sun.misc.Unsafe?

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/

like image 588
yuriyo Avatar asked Oct 19 '11 15:10

yuriyo


People also ask

Is Java native interface slow?

Java calling C++ (or C) via the "native" keyword is very fast, around 50 clock cycles.

What is native interface reasons to use JNI?

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.

What JNI calls?

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 ...


1 Answers

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.

like image 140
Peter Lawrey Avatar answered Oct 30 '22 02:10

Peter Lawrey