性能开销JNI vs Java vs Native C

时间:2018-04-13 18:48:14

标签: java c java-native-interface native

我是JNI(或母语编程)的新手,非常感谢您提供帮助。这是我正在尝试做的事情以及执行时间。

我试图找到大小为100,000,000的双精度数组元素的总和,并试图让JNI更快地获得它。

对于Java(纯Java),它需要154ms 对于C(纯C),需要0 ms 对于JNI(Java调用Native C),需要800 ms

我知道JNI会有自己的性能开销,但是我只需要花费时间来执行JNIEXPORT jdouble JNICALL Java_Sample1_sum 1 ms(即在控件进入之后和之前离开此求和方法),所以我的问题是JNI是如此之慢,以至于调用JNI本身需要大约799毫秒,即下面的块需要800 ms

start = System.currentTimeMillis(); sample.sum(doubleArray); end = System.currentTimeMillis();

如果这对答案没有帮助,我可以分享我的整个代码。另外,我搜索了有关优化JNI的信息。

1 个答案:

答案 0 :(得分:1)

正如lexicore建议:

  1. 检查如何为您的java解决方案here创建适当的基准。
  2. 然后按照并实施第一个答案here中找到的基准测试解决方案。
  3. 作为旁注和个人经验 - 决定使用JNI解决方案而不是使用Java,或者使用带有C / C ++端流程的IPC解决方案时,有许多重要因素。

    示例注意事项:

    1. 预计会调用多少次API?
    2. 这是应该重构的遗留代码还是新的解决方案?
    3. 这是一个应该优化的实际,时间关键的交易吗?
    4. 解决方案是否会发生很大变化,还是一次性努力?
    5. 不要轻易选择JNI或IPC C / C ++。这里有很大的开销。

      并且不要忘记Java的即时编译可以通过多个方法调用来创建奇迹(我用c / c ++标记了这一点,并且对java的长期,摊销速度与c / c ++相比感到惊讶)。

      祝你好运!