我正在阅读一些关于 Java 是否可以比 C++ 更快的材料,并且遇到了以下引用:
Java 可以比 C++ 更快,因为 JIT 可以内联虚函数边界。
这是什么意思?这是否意味着 JIT 可以内联虚函数调用(因为它可能可以访问运行时信息)而 C++ 必须通过其 vtable 调用该函数?
我正在阅读一些关于 Java 是否可以比 C++ 更快的材料,并且遇到了以下引用:
Java 可以比 C++ 更快,因为 JIT 可以内联虚函数边界。
这是什么意思?这是否意味着 JIT 可以内联虚函数调用(因为它可能可以访问运行时信息)而 C++ 必须通过其 vtable 调用该函数?
你的问题的答案是肯定的:这就是引用的文字的意思。
JIT 将分析所有加载的类。如果它可以确定在任何给定点只能调用一个可能的方法,它可以避免分派和(如果合适的话)内联方法体。
相比之下,C++ 编译器不知道所有可能的子类型,因此无法确定是否可以对(虚拟)方法进行这种优化。(当链接器运行时,为时已晚......)
其他答案说您可以在 C++ 中手动进行此优化......但假设您(程序员)可以自己进行分析,并将方法从虚拟更改为非虚拟。但是如果你弄错了,你就有了一个要追踪的错误。
顺便说一句,我们可以假设这种优化对于普通的 Java 应用程序是值得的。如果不是,JIT 编译器的人就不会实现它。毕竟,毫无价值的优化只会让 Java 应用程序启动得更慢。
就其价值而言,Java、C++、Assembly 将提供相对相同的性能。
是的,使用手动优化的 C++、C 或 Asm 可以获得更好的性能……但是,对于大多数应用程序(尝试除严重图形应用程序之外的所有应用程序),这不是瓶颈,而且实施弥补了任何感知到的较低性能。