Java如何内联虚拟function边界?

我正在阅读一些关于Java是否比C ++更快的材料,并且看到了以下引用:

Java可以比C ++更快,因为JIT可以内联虚拟function边界。

为什么Java总是比C ++慢 (返回链接 )

这是什么意思? 这是否意味着JIT可以内联虚函数调用(因为可能它可以访问运行时信息)而C ++必须通过其vtable调用函数?

您的问题的答案是肯定的:这就是引用文本的含义。

JIT将分析所有已加载的类。 如果它可以确定在任何给定点只能调用一种可能的方法,则可以避免调度和(如果适用)内联方法体。

相比之下,C ++编译器不知道所有可能的子类型,因此无法确定是否可以对(虚拟)方法执行此优化。 (当链接器运行时,为时已晚……)

其他答案说你可以在C ++中手动进行优化……但是假设你(程序员)可以自己做分析,并将方法从虚拟变为非虚拟。 但如果你弄错了,你就有一个要追查的错误。

顺便说一句,我们可以假设这种优化对于普通的Java应用程序来说值得的。 如果不是,JIT编译器人员就不会实现它。 毕竟,一个毫无价值的优化只会让Java应用程序启动得更慢。

由于Java字节码到机器代码的编译延迟到运行时,因此JVM可以执行配置文件引导的优化和其他优化,这些优化需要在代码运行之前不可用的信息。 这甚至可能包括“去优化”,其中先前进行的优化被撤销,以便可以进行其他优化。

有关此内容的更多信息可以在Wikipedia上的自适应优化下找到,其中包括与内联相关的优化。

对于它的价值,Java,C ++,Assembly将提供相对相同的性能。

是的,可以通过手动优化的C ++,C或Asm实现更好的性能……然而,对于那些应用程序的大量应用(尝试除了严肃的图形应用程序之外的所有东西),这不是瓶颈,而且 – 和 – 的成本更低实施弥补了任何感知到的较低性能。