java - JNI 与 JNA 性能对比

标签 java c concurrency java-native-interface jna

我们有一个原生 c/asm 应用程序,利用 GPU(OpenCL) 使用特定方法处理大型 加密/解密 数据,它运行完美,没问题. JEE正在开发一部分项目(web和distribution),我们只需要调用native application/library即可。

我们尝试使用 Process 类将其称为分离的外部进程。问题是我们无法控制应用程序(事件、处理程序、线程等)。我们还尝试将 C 代码转换为 Java 代码,但性能下降了。除了将 native 代码作为进程运行之外,我正在考虑 JNA 和 JNI,但有一些问题。

问题:

  1. 为了更好(更快)的读/写解决方案,是否可以在 JNI 和 JNA 中通过直接(非托管)内存 [Java(ByteBuffer#allocateDirect())] 交换数据?<
  2. 是否可以通过原生代码管理和处理进程,通过 Java 代码(OpenCL lib)访问 GPU(共享)内存?
  3. 性能如何? JNA 比 JNI 快吗?

我们在 Redhat Linux6 x64 上有两个 AMD W7000 集群设备。

最佳答案

JNA 比 JNI 慢得多,但更容易。如果性能不是问题,请使用 JNA。

使用直接缓冲区的优点是最关键的操作不使用 JNI 或 JNA,因此速度更快。他们使用内在的 when 意味着他们变成了单一的机器代码指令。

如果 Java 代码比 C 代码慢得多,则很可能代码没有得到足够的优化。一般来说,GPU 应该做所有的工作,所以如果 Java 有点慢,这应该没什么区别。

例如如果您将 99% 的时间花在 GPU 上,而 Java 花费两倍的时间,那么总速度会慢 99+2% 或 1%。

关于java - JNI 与 JNA 性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288909/

相关文章:

java - 如何根据机器字节序运行测试?

java - 使用 Apache POI 库将 Excel 电子表格转换为 HTML

Java android - 如何拆分其中包含空数据的字符串数据

c - Xcode 编辑器不包含 stdio.h

java - 发生之前和易变变量

java - 如何获取使用 FileOutputStream 保存的文件的 URI?

c - 在 Perl 程序中嵌入模块

比较二维数组中的元素

c++ - 我是否需要使用互斥锁来保护从不同线程对互斥锁数组的访问?

java - 此生产者消费者的非法监视器状态异常?