我正在阅读有关Java是否比C ++更快的一些材料,并且出现了以下引用:
Java可以比C ++更快,因为JIT可以内联虚拟函数边界。
Why Java Will Always Be Slower than C++(wayback link)
这是什么意思?这是否意味着JIT可以内联虚函数调用(因为可能它可以访问运行时信息)而C ++必须通过其vtable调用函数?
答案 0 :(得分:10)
您的问题的答案是肯定的:这就是引用文字的含义。
JIT将分析所有已加载的类。如果它可以确定在任何给定点只能调用一个可能的方法,它可以避免调度和(如果合适的话)内联方法体。
相比之下,C ++编译器并不知道所有可能的子类型,因此无法确定是否可以对(虚拟)方法进行此优化。 (当链接器运行时,为时已晚......)
其他答案说你可以在C ++中手动进行优化......但是假设你(程序员)可以自己进行分析,并将方法从虚拟变为非虚拟。但如果你弄错了,你就有一个要追查的错误。
顺便说一下,我们可以假设这个优化对于普通的Java应用程序来说是值得的。如果不是,JIT编译器人员就不会实现它。毕竟,一个毫无价值的优化只会让Java应用程序启动得更慢。
答案 1 :(得分:4)
由于将Java字节码编译为机器代码延迟到运行时,JVM可以执行profile-guided optimization以及其他需要在代码运行之前不可用的信息的优化。这甚至可能包括“去优化”,其中先前进行的优化被撤销,以便可以进行其他优化。
有关此内容的更多信息可以在维基百科上的adaptive optimization下找到,其中包括与内联相关的优化。
答案 2 :(得分:2)
为了它的价值,Java,C ++,Assembly将提供相对相同的性能。
是的,可以通过手动优化的C ++,C或Asm实现更好的性能......但是,对于那些应用程序的大量应用(尝试除了严肃的图形应用程序之外的所有内容),这不是瓶颈,而且 - 和 - 较低的实施成本弥补了任何感知到的较低性能。