我正在开发类似于sun.misc.Unsafe的JNI实现,但具有扩展内存管理。
如何从sun.misc.Unsafe和我开发的库中解释本机方法的调用时间是非常不同的?
有些数字: sun.misc.Unsafe.getInt(地址)需要〜1ns 当我的类似方法需要~10ns
时两个实现完全相同,遵循openJDK的源代码,只是通过指针返回变量。在JNI模块中不安全,以与其他模式相同的方式注册。
如何加快JNI通话?是什么让Unsafe对性能如此特别?
谢谢, 尤里/
答案 0 :(得分:9)
如果您在Unsafe类中查找本机方法的源代码,您会发现没有JNI实现。相反,不安全方法被内联为机器代码。例如,getInt(long)
成为一个机器代码指令。
因此,您无法编写与使用Unsafe一样快的JNI方法,而无需更改JVM以便内联机器代码。