关于Java中重度数学计算的问题

Sid*_*Sid 5 java performance native

我在我的项目中使用Java,它进行了大量的数学计算.在项目的下一次迭代中,将添加一些更多的计算.根据我对Java的了解,我怀疑这会导致性能问题.将繁重的计算委托给Fortran或C等低级语言是明智的决定吗?我可以触发本机调用与低级语言进行通信.一旦Fortran或C执行计算,Java将采取控制措施.这会改善性能吗?

ska*_*man 9

注意不要低估现代Java VM.第一代的速度非常慢,特别是在浮点运算时,但现代的确非常快.

话虽如此,其他选择可能会更快.

当然,你应该运行一些基准测试.不要假设一个比另一个更快,得到一些具体的性能测量并在此基础上做出决定.

还要考虑"原生"解决方案的额外性能(如果有的话)是否值得编写和集成它的额外麻烦.

  • 另外请注意,如果你在JNI周围和跨越JNI复制数据,那里还有另一个重大打击.我参与的大多数重数字代码也涉及大数据集,因此IO受限(通过CPU和内存之间的路径)而不是CPU限制,混合Java和本机代码会使情况变得更糟. (4认同)

Car*_*icz 6

Java中的整数和浮点数学都是直接传递给硬件的,因此这样的计算原则上不会比C语言或者FORTRAN慢.事实上,像超越函数(sin(),等)这样的东西的库例程是用C实现的,所以再没有理由去寻找其他库.sqrt()log()

我希望你的问题给我们一些信息.你提到有很多计算正在进行,这就是数字运算.但是你没有告诉我们这些数字是如何组织和访问的.这可能是有趣且有用的信息.如果您使用复杂的对象结构来保存数据,那么访问这些结构需要时间.如果您的结果创建了新对象,那也很昂贵.如果使用数组,那些也是对象.Java中的多维数组是数组的数组,通过多个维度进行索引可以解析为比其他语言慢的对象引用.虽然我没有基准来证明它,但我怀疑你可能会更好地用一维数组替换多维数组并且有点"

一个非常简单的优化可能是简单地使用-serverJVM 的选项(如果可用)来获得更多预编译的好处,如果你还没有这样做的话.

然而,在你盲目地重新设计你的程序之前,我是第二个人建议你描述你的计算.令人惊讶的地方可能存在瓶颈.