我只是想提一下,我并没有要求代码,也不是一个特定的编码问题。我知道我可以用Java编写一个比C++(未优化)运行得更快的程序,例如链接。但我无法想象如何使Java程序比其在C++中的版本(已优化)更快。@Rekin和@Cyan对我的问题提出了见解,但我想让它保持开放状态一段时间,或者有人展示JVM运行时优化,这些优化在编译C++代码时不适用,即gcc -O3。 - Antonio
4个回答
10
10
理论上,是的。但在实践中,这种可能性极小。 其中一个基本假设是,C / C ++只编译一次以获取二进制操作码目标,而Java则编译为正在运行的特定机器。这应该给Java带来优势。但现实情况是,即使是C / C ++也可以有几条优化路径,在运行时动态选择,并获得针对特定目标的编译的大部分好处。 相反,正如Rekin所述,Java JVM需要动态地对Java程序进行分析,以了解要优化的内容以及如何优化。分析本身就是一个昂贵的操作,并且Java JVM无法摆脱这种开销。另一方面,选择适当的优化集可以提供优势。实际上,大多数C程序(但不是全部 :))都为其任务进行了良好的调整,使用分析技术几乎没有留下什么可优化的余地。 在Java中还有其他效果,它们完全超过了这些编译问题。可能排在第一位的是垃圾回收器。 垃圾收集器的第一个任务是简化编程,照顾和避免C / C ++中最讨厌的经常性错误之一,即内存泄漏。单靠这个功能就足以证明Java在许多工业环境中的广泛使用。 然而,它有一个很大的代价。非常大的代价。根据研究,必须可用约5倍于严格必要内存量的内存,以确保垃圾收集器以最小的开销工作。因此,每当这种数量的内存不足时,GC开销开始变得显着,将性能降至爬行。 相反,在某些情况下,从内存分配负担中释放算法可能允许更改算法并采用更好,更快的算法。在这种情况下,Java可以获得优势,并比C程序更快。 但是正如您所料,这是不常见的...
由于C/C++程序是专门为特定平台编写并直接编译成机器码,因此它们与其运行的软件/硬件平台更加接近,因此速度更快。 Java优化内置于JVM中,最佳优化(以执行程序的速度为标准)是通过即时(JIT)处理字节码实现的。虽然JIT被证明更加占用内存。 因此,比较这些策略清楚地显示出C/C++本机代码将更快;因为即使使用JIT,JVM仍然需要一些开销将字节码转换为本机代码。 但这是依赖平台和Java更具可移植性所付出的代价。 引自when is java faster than c++ (or when is JIT faster then precompiled)?,我发现在以下情况下Java执行可能会优于C/C++: 大量小内存分配/释放。主要JVM具有极其高效的内存子系统,并且垃圾回收可以比要求显式释放更有效(还可以移动内存地址等等)。 通过深层次方法调用的高效访问。 JVM非常擅长省略不必要的内容,通常比大多数C ++编译器(包括gcc和icc)更好,部分原因是因为它可以在运行时进行动态分析(即可以过度优化并仅在检测到问题时取消优化)。 将功能封装到短暂的小对象中。
- Gyanendra Dwivedi
1
2JVM 倾向于更好地优化掉那些没有任何用处的代码。具有动态编译的能力意味着它可以基于运行时才知道的信息进行优化。 - Peter Lawrey
gcc -O3
。 - Antonio