Java在数值算法中的性能

Java在数值算法中的性能,java,performance,optimization,numerical,sse,Java,Performance,Optimization,Numerical,Sse,我对Java数值算法的性能很好奇,比如说矩阵双精度乘法,使用最新的JIT机器与手工调优的SSE C++/assembler或Fortran对应程序进行比较 我在网上看过,但大部分结果都来自近10年前,我知道Java从那时起取得了很大进步 如果您有在数字密集型应用程序中使用Java的经验,您可以分享您的经验。另外,Java在循环相对较短、内存访问不是很统一但仍在一级缓存限制内的内核中的性能如何?如果这样的内核连续执行多次,JVM可以在运行时对其进行优化吗 感谢您,Java使用实时(JIT)编译器将

我对Java数值算法的性能很好奇,比如说矩阵双精度乘法,使用最新的JIT机器与手工调优的SSE C++/assembler或Fortran对应程序进行比较

我在网上看过,但大部分结果都来自近10年前,我知道Java从那时起取得了很大进步

如果您有在数字密集型应用程序中使用Java的经验,您可以分享您的经验。另外,Java在循环相对较短、内存访问不是很统一但仍在一级缓存限制内的内核中的性能如何?如果这样的内核连续执行多次,JVM可以在运行时对其进行优化吗


感谢您,Java使用实时(JIT)编译器将字节码转换为本机语言-因此,第一次运行代码块时,速度会变慢,但一旦段“预热”,性能将相当。简言之,数字性能非常好。

第二,最好的办法是自己测试,因为性能会因具体操作的不同而有所不同。我觉得很难相信Shane C. Mason的回答,java性能将与C++或FORTRAN性能相同,因为C++和FORTRAN甚至不能与某些科学计算算法相媲美。p>
我有一个用C++编写的计算流体力学代码,同样的代码基本上翻译成FORTRAN。我还不确定为什么,但是FORTRAN版本的速度是C++版本的两倍。我想,有了边界检查和垃圾收集等特性,Java会比这两者都慢,但在测试之前我不知道

> P>是java与VC++的编程语言的一个链接,它将给你比较java在多个计算密集型算法上的速度。它还将向您展示最高性能的java代码。在大多数情况下,对于这几个特定的基准测试,java需要更多的时间(但不超过2或3次)来运行。

这是从.NET的角度来看的,但我90%确信java也是如此。虽然JIT将尽可能地使用SSE指令,但在处理矩阵乘法等问题时,它目前不会自动向量化代码。使用编译器内嵌/内嵌汇编的手工矢量化C++在这里肯定会更快。P> >这可以依赖于C++代码中的内容。

例如,您正在使用GPU吗编辑我忘记了jogl,所以Java可以在这里竞争

如果使用STM或共享内存进行并行化,那么Java就无法与之竞争。 有关并行矩阵乘法分析的链接:

您是否有足够的内存在内存中进行计算,这样就不需要垃圾收集器了,您是否对垃圾收集器进行了微调以获得最佳性能?那么,Java可能会具有竞争力

你使用多核,C++是利用这个体系结构来优化的吗?那么Java将无法与之竞争

如果您使用多台计算机捆绑在一起,那么Java将无法与之竞争

如果您使用这些工具的任意组合,那么它将取决于特定的实现

java不是设计用来与手工调谐C++程序竞争,但是,调整时间需要做足够的计算,这会有什么关系?java将能够给出一些合理的速度,但工作量比手工调整少,但对C++代码的改进没有多大的改进。


<>你可能想看看Haskell或Erlang是否有改进,比如说C++,因为这些语言是为这类工作而设计的。

< P> java中最薄弱的一点是(原生)矩阵运算。这是由于Java矩阵的性质:

  • 不能将矩阵声明为矩形,即每行可以有不同数量的列

  • 从技术上讲,矩阵不是“double(或int…)矩阵”,而是…数组的数组。最大的区别在于,因为数组是Java对象,所以可以将同一个数组对象分配给多行

这两个属性使得编译器无法进行许多标准的矩阵优化


通过使用在单个长数组上模拟矩阵的Java库,您可能会获得更好的性能。但是,对于所有访问,您都有方法调用的开销。

C++肯定会更快。您甚至可以有一些手动优化的库,其中包含每个主要CPU的汇编代码。再好不过了

之后,如果需要,您可以使用JNI从Java调用它


Java不适用于这样的高性能算术计算。如果您依赖于这些,我建议您选择一种合适的低级语言来实现它。或者,您也可以用低级语言编写特定于性能的部分,然后使用JNI或其他IPC方法将其连接到Java前端。

您感兴趣的计算是快速傅立叶变换、雅可比连续过松弛、蒙特卡罗积分、稀疏矩阵Mult、,稠密LU矩阵分解

它们构成了可在计算机上作为小程序启动的

此外,还有一系列的计划,以及一个



类似地,您可以使用和。

我已经用Java编写了一些相当大且对性能敏感的数字代码(通常处理大量的双精度数组)

我发现Java对于快速数值计算来说“足够好”。特别是当你认为你通常没有CPU绑定时,内存延迟和缓存感知可能是你对大数据集最大的问题。 霍维夫