我相应地做了一个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/