相关疑难解决方法(0)

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

我从其他几个报告中读到,人们通常会在一个简单的基本JNI呼叫上大约4-80 ns:

什么使JNI呼叫变慢?

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

使用JNI可能增加的性能?

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

c java performance java-native-interface

7
推荐指数
1
解决办法
1929
查看次数

JNI表现

我们的主程序是java,但是从存储中提取数据的代码是用C语言编写的.我需要从提取的数据中构建一个HDF5文件.使用JNI调用C代码获取数据然后从Java构建HDF5文件还是从C代码构建HDF5会更好吗?

我对JNI或C的经验不多.

我们的主要标准之一是表现.使用JNI时有多少性能影响?

java-native-interface hdf5

2
推荐指数
1
解决办法
3311
查看次数

标签 统计

java-native-interface ×2

c ×1

hdf5 ×1

java ×1

performance ×1