我从其他几个报告中读到,人们通常会在一个简单的基本JNI呼叫上大约4-80 ns:
对于琐碎的原生方法,去年我发现在我的Windows桌面上平均调用40 ns,在我的Mac桌面上调用11 ns.
然而,JNI通常需要大约30 ns.
当我在我的JNI代码中调用简单方法时(简单来说,我的意思是时间int返回类型int只有一个参数),我的往返调用时间(用System.nanoTIme测量)在50,000-80,000 ns之间.
如果我做一个VM"预热"并在计时之前运行几百次,我仍然会得到大约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);
}
Run Code Online (Sandbox Code Playgroud)
其中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);
}
Run Code Online (Sandbox Code Playgroud)
这是"热身"代码.初次调用后,大多数printlns读取800-1000ns.
不幸的是,我可能不得不废弃它,因为它应该用于渲染,并且每秒调用数千次将帧速率降低到1 FPS.
系统信息:
行为类似:JDK1.6.0_32(64位),JDK1.7.0_04(64位)和JRE1.7.0_10(32位)
Windows 7 64位
16GB RAM
i7-3770四核CPU @ 3.4-3.9ghz
GNU GCC MinGW编译器(32位和64位)
我们的主程序是java,但是从存储中提取数据的代码是用C语言编写的.我需要从提取的数据中构建一个HDF5文件.使用JNI调用C代码获取数据然后从Java构建HDF5文件还是从C代码构建HDF5会更好吗?
我对JNI或C的经验不多.
我们的主要标准之一是表现.使用JNI时有多少性能影响?