java - Java JNI 调用比预期慢(至少 2 毫秒/调用)

java - Java JNI 调用比预期慢(至少 2 毫秒/调用)

我从其他几份报告中读到,人们通常在一个简单的基本 JNI 调用中得到大约4-80 ns :

从是什么让 JNI 调用变慢?

对于琐碎的本机方法,去年我发现在我的 Windows 桌面上平均调用 40 ns,在我的 Mac 桌面上平均调用 11 ns ..

从使用 JNI 可能提高性能?

然而,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 位)

风雨相关