我查看了StackOverflow和Googled上的相关主题并没有太多运气。我也是Java的新手(我来自C#和.NET背景)所以请耐心等待。在Java世界中有很多可用的东西,它非常强大。
我正在开始一个新的Java-on-Linux项目,需要一些繁重且高度重复的数值计算(即统计,FFT,线性代数,矩阵等)。因此,最大化数学运算的性能是必要的,因为确保数学是正确的。因此,我有兴趣找到一个可能利用MKL等本机加速的Java库,并且已经过验证(因此商业选项肯定是可行的)。
在.NET领域,有高度优化和MKL加速的商业数学库,如Centerspace NMath和Extreme Optimization。 Java中有什么可比的吗?
我发现的大多数Java数学库似乎都没有被主动维护(例如Colt),或者似乎没有利用MKL或其他原生加速(例如Apache Commons Math)。
我曾考虑过尝试直接从Java中利用MKL(例如JNI),但我不熟悉Java(更不用说在Java和本机库之间进行互操作)了,找到一个已经正确,高效地完成了这项工作的Java库似乎更聪明,并且证明了。
如果我误解或误导(即使是关于我提到的任何库)以及我对Java产品的无知,我再次道歉。对于我来说,这是一个全新的世界,来自商业化程度很高的Microsoft堆栈,所以我很容易错误地看到我所提到的Java库的位置。我非常感谢任何帮助或建议。
答案 0 :(得分:1)
对于像FFT(数组上的批量操作)这样的东西,java 中的范围检查可能会杀死你的性能(至少最近它会这样做)。您可能希望查找优化其索引边界可证明性的库。
Java编程语言 规范需要数组边界 检查每个人 阵列访问。索引边界检查 编译时可以删除 可以证明一个索引用于 数组访问在范围内。
我实际上会查看JNI,如果它们个别非常大,那么就在那里进行批量操作。操作所需的时间越长(即解决大型线性系统或大型FFT),使用JNI的价值就越大(即使你必须在那里回忆)。
答案 1 :(得分:1)
就个人而言,我同意你的一般方法,将重量级数学从Java卸载到商业级库。
搜索Java / MKL集成I found this所以你提出的建议在技术上是可行的。另一个需要考虑的选择是NAG libraries。我一直使用MKL,虽然我在Fortran中编程所以没有集成问题。我当然可以推荐他们的质量和性能。例如,我们针对我们自己构建的版本测试了MKL的MKL版本。 MKL实现速度快了一个小的整数倍。
如果您对通过JNI调用库的性能有疑虑,那么您应该计划构建应用程序以减少较大的调用,而不是更小的调用。至于使用JNI的困难,我的观点(我已经完成了一些JNI编程)是你在学习如何使用界面时所做的最初努力将得到很好的回报。
我注意到你似乎并没有对你可以使用的Java数学库的建议感到不知所措。像你一样,我会怀疑从网上搜寻的研究质量,低使用率的Java库。
答案 2 :(得分:-1)
我认为你最好避免使用它们。我可能错了,我不太熟悉,所以除非有其他人同意我的意见,否则不要过多考虑,但是调用JNI需要相当大的开销,因为它必须走出去JRE以及所做的一切,所以除非你将很多东西组合成一个单独的功能,否则外部库的微小优势将远远超过调用它们的成本。我放弃寻找MKL库并找到优化的纯Java库。我不能说我知道比推荐的标准更好,抱歉。