Java+JNI 相对于纯C++

标签 java java-native-interface

我相应地做了一个DLL-Java通信this post 。你可以在那里看到我的编译配置:

    g++ -IC:\Users\RZ\Downloads\eigen-eigen-3.0.3\eigen-eigen-3.0.3 -IC:\Program Files\Java\jdk1.7.0\include\win32 -IC:\Program Files\Java\jdk1.7.0\include -O3 -msse -msse2 -mmmx -Wall -shared -c -o Vector3DImp.o ..\Vector3DImp.cpp
..\Vector3DImp.cpp:5:0: warning: "JNICALL" redefined
C:\Program Files\Java\jdk1.7.0\include\win32/jni_md.h:31:0: note: this is the location of the previous definition
g++ -Wl,--kill-at -shared -LC:\Program Files\Java\jdk1.7.0\lib -o Eigen.dll Vector3DImp.o

然后我在 Java 上写了同样的内容。并用 vector 乘法和 vector 加法进行一些测试:结果是:

纯java 39 -38 毫秒

JNI Java 52 -50ms

然后我使用 DLL 中的相同代码在 C++ 上编写相同的测试。 结果:

22 – 18 毫秒

是的,测试策略看起来很粗糙,但共同的结果是可持续的。 是我的错还是 JNI 的缺点(我不擅长)。

注意:

主要问题是:Java中的DLL使用真的这么难吗(性能降低了2.5倍)。为什么会这样?

更新:

根据要求,there is source of test 。 抱歉弄乱了,这是为了我自己的需要而在短时间内制作的。

我的系统配置: Windows 7 x32、酷睿 2 双核。

Java 和 C++ 项目都是在 Eclipse IDE 中使用 MingW C++ 编译器构建的。对于C++ vector 计算Eigen library被使用了。另外,我尝试过JBlas library ,最后Java测试很糟糕,我不知道为什么。即使进行 3 次乘法运算(与叉积中的 6 次乘法相反),结果也是令人毛骨悚然。看看你自己。

最佳答案

JNI 是软件堆栈中的另一层。除非迫不得已,否则不知道为什么要使用它。通常,JNI 用于访问其他非 Java 代码库(已经存在的 DLL,它们为您做一些复杂的事情 - 比如说,如果您希望您的软件在 Windows 上使用 DirectX - 您可以使用 JNI 包装它)。

我想我想说的是,我对有一些性能开销并不感到非常惊讶,而且我不认为这真的是你的错。每当您必须进行所谓的“系统”调用(即调用 JVM 之外的系统资源(或 DLL、或某些 I/O 等))时,性能都会受到影响。

关于Java+JNI 相对于纯C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789077/

相关文章:

java - 重定向主页中的所有页面

java - Eclipse - gwtupload - maxSize

java - 在 Android Studio 中运行 YouTube Activity 时出错

java - ioctl() 与 JNI : broken file descriptor

java - 通过jni将jint数组从c返回到java

android - Android JNI 中的 Cpp 标志 - 根据标志更改变量

c# - 使用窗口消息传递在 JAVA 和 C# 之间进行应用程序间通信

java.lang.IllegalStateException : Already connected at setDoOutput 错误

java - 为什么内部类实例变量不能修改外部类实例变量,而内部类局部变量可以

java - 无法在 JNI 项目中加载 .so