将Java编译为本机代码的性能提高了吗?
时间:2020-03-05 18:49:51 来源:igfitidea点击:
如今,从将Java编译为本地代码是否可以获得任何性能,还是随着时间的流逝,现代的热点编译器最终都会这样做吗?
解决方案
回答
内存性能还是CPU性能?还是这些天都一样?
我唯一的证据是轶事,并且在另一个平台上:将大量需要CPU的应用程序移植到C(.NET 2.0)之后,我没有发现性能上的实质损失(我认为10%的水平并不重要)。编写良好的代码似乎在各种体系结构上都表现良好。
大多数应用程序花费/浪费时间在:
- 无法从静态(编译时)分析中受益的IO操作。
- 不能从静态分析中受益的错误算法。
- 关键CPU内部循环中的错误内存布局。尽管从技术上讲编译器可以在这里为我们提供帮助,但我还没有看到真正的编译器可以做任何有趣的事情。
因此,根据我的经验,除非我们正在编写视频编解码器,否则与仅依赖于热点编译器相比,编译Java应用程序没有任何好处。
回答
最近,在这里有一个类似的讨论,问题是字节码相对于本机代码的优势是什么?我们可以在该线程中找到有趣的答案。
回答
一些轶事证据。我已经研究了一些对性能至关重要的实时交易金融应用程序。我同意弗兰克的观点,几乎每当我们遇到的问题不是缺少被编译时,而是算法或者数据结构。现代的热点编译器使用正确的代码非常好,例如,CERN Colt库在为数字工作而编译,优化的Fortran的90%之内。
如果我们担心速度,我真的会推荐一个好的分析器,并获得有关瓶颈所在的证据,我使用YourKit感到非常满意。
在过去的几年中,我们仅在一次实例中求助于本机编译代码,因此我们可以使用CUDA并获得出色的GPU性能。
回答
问题有点大,答案相差很大
- 如果我们使用的不是即时编译(JIT)
- 使用时,是否长时间执行了进程
所有最新的JVM都使用JIT,但是在旧的JVM上,Java代码比本机代码慢几倍。
如果服务器长时间运行或者成批运行,并且一次又一次地执行相同的代码,则两者之间的差异非常小。
我们用C ++和Java编写了相同的批处理,并使用不同的数据集运行它,结果相差约3秒钟,而数据集需要5分钟到几个小时的时间。
但是要小心,它们是特殊的情况,会有重要的区别,例如需要大量内存的批处理。