11

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

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

为什么 Java 总是比 C++ 慢回路链接

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

4

3 回答 3

11

你的问题的答案是肯定的:这就是引用的文字的意思。

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

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

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

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

于 2009-11-12T03:38:47.143 回答
4

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

有关这方面的更多信息,请参阅 Wikipedia 上的自适应优化,其中包括与内联相关的优化。

于 2009-11-12T03:05:43.077 回答
2

就其价值而言,Java、C++、Assembly 将提供相对相同的性能。

是的,使用手动优化的 C++、C 或 Asm 可以获得更好的性能……但是,对于大多数应用程序(尝试除严重图形应用程序之外的所有应用程序),这不是瓶颈,而且实施弥补了任何感知到的较低性能。

于 2009-11-12T02:57:31.097 回答