最近,我看到了多个说法,讨论Java (以及Scala等基于JVM的语言)在性能上如何与C/C++代码相媲美。
例如,根据对ScalaLab项目的描述
基于Scala的脚本编写速度,接近于本机和优化Java代码的速度,因此与基于C/C++的科学代码接近,甚至更好!
有人能告诉我这些JVM优化是什么吗?是否有任何真正的基准支持这一主张或提供一些现实世界的比较?
发布于 2013-04-22 03:38:07
当然,实际性能取决于基准和应用程序的不同。但是很容易看出JIT VM是如何与静态编译代码一样快的,至少在理论上是这样的。
JIT代码的主要优点是它可以基于仅在运行时已知的信息进行优化。在C中,当您链接到DLL时,每次都必须进行函数调用。在动态语言中,函数可以内联,即使它是在运行时加载的函数,这要归功于及时编译。
另一个例子是基于运行时值的优化。在C/C++中,您使用预处理器宏禁用断言,如果要更改此选项,则必须重新编译。在Java中,通过设置一个私有布尔字段,然后在代码中放置一个if分支来处理断言。但是,由于VM可以编译包含或不包含断言代码的版本,这取决于标志的值,所以性能几乎没有受到影响。
另一个主要的VM创新是多态内联。Idomatic非常关注小型包装方法,如getter和setter。为了获得良好的性能,显然有必要对其进行内联。VM内联多态函数不仅可以在只调用一种类型的常见情况下实现,还可以通过在适当的代码中包含内联缓存来调用多个不同类型的内联代码。如果代码开始在许多不同的类型上运行,VM可以检测到这一点,并返回到较慢的虚拟分派。
当然,静态编译器不能这样做。强大的静态分析只能把你带到目前为止。这也不仅仅局限于Java,尽管这是最明显的例子。谷歌用于Javascript的V8虚拟机速度也相当快。Pypy的目标是对Python和Rubinius的Ruby做同样的事情,但是它们并不完全存在(当你有一家大公司支持你的时候,这会有所帮助)。
发布于 2013-05-09 07:54:42
我想添加hotspot、jrockit和IBM的JVM都在GC中执行堆压缩。由于这个原因,我最近将一些繁重的数学代码移植到Scala。如果您打算运行任何大型应用程序,我将强烈推荐Java。您可能会后悔在部署到服务器或升级时使用CLR,特别是在内存密集型的情况下。
另外,对于本机代码,JVM配置选项非常好。
https://stackoverflow.com/questions/16138888
复制相似问题