我从其他几份报告中读到,人们通常在一个简单的基本 JNI 调用中得到大约4-80 ns :
对于琐碎的本机方法,去年我发现在我的 Windows 桌面上平均调用 40 ns,在我的 Mac 桌面上平均调用 11 ns ..
然而,JNI 调用通常需要大约 30 ns ..
当我在我的 JNI 代码中调用简单方法时(简单我的意思是返回类型 int 的时间参数不超过一个参数),我得到的往返调用时间(使用 System.nanoTIme 测量)在 50,000-80,000 ns 之间。
如果我做一个虚拟机“热身”并在计时之前运行几百次调用,我仍然会得到大约2000-4000 ns(低于 800-1000)。(如上所述,我听说其他人报告 < 100 ns .. 并且在频繁通话时确实会高出 10-20 倍。)
这是正常速度吗?什么可能导致我的本机代码被调用这么慢?
更新:
JNIEXPORT jint JNICALL Java_com_snap2d_gl_RenderControl_correctGammaNative
(JNIEnv *env, jobject obj, jint pixel) {
return X2D_correctGamma(pixel, 1.0f);
}
其中 X2D_correctGamma(int,float) 是一种校正像素伽马值的方法(自发布以来我已经实现了本机代码)。
Java基准测试:
for(int i = 0; i < 100; i++) {
long t1 = System.nanoTime();
correctGammaNative(0xFFF);
long t2 = System.nanoTime();
System.out.println(t2 - t1);
}
那是“热身”代码。大多数 println 在初始调用后读取 800-1000ns。
不幸的是,我可能不得不放弃它,因为它应该用于渲染,每秒调用数千次会将帧速率降低到 1 FPS。
系统信息:
行为类似:JDK1.6.0_32(64 位)、JDK1.7.0_04(64 位)和 JRE1.7.0_10(32 位)
Windows 7 64 位
16GB 内存
i7-3770 四核 CPU @ 3.4-3.9ghz
GNU GCC MinGW 编译器(32 位和 64 位)