Java方法调用比C ++中的虚方法调用更快?

时间:2013-02-17 08:37:47

标签: java c++ performance call virtual

在维基百科中偶然发现了这一点:

  

Java可以比C ++更快地访问派生实例方法   由于C ++的额外虚拟表查找而导出的虚拟方法。   但是,C ++中的非虚方法不会受到V-Table的影响   性能瓶颈,因此表现出类似的性能   Java。

这是对的吗?据我所知,ALL调用在Java中是虚拟的,仍然依赖于虚拟表,因此我的常见逻辑表明Java调用不可能比虚拟C ++调用更快。

我是否误导或文章错了?无论如何 - 在运行时解析调用的方法是否比虚拟表更快?

2 个答案:

答案 0 :(得分:7)

它可能与JIT编译执行的优化有关。在某些情况下,我可以想象JVM会检测到某个(虚拟)调用总是引用某个实现并且不需要查找。

OTOH,C ++编译器也可能推断出在某些情况下不需要查找并产生同样好的代码。此外,C ++不需要虚函数,因此Java提供了另一种选择。

也就是说,如果你需要virtual在C ++中提供的功能,那么我认为通常没有更好的选择。如果您关心性能,请注意virtual通常确实有成本,并且只应在需要时使用。

一般来说,我发现你所引用的陈述没有帮助和误导(当然不是你的错)。

答案 1 :(得分:3)

为该引用阅读source

  

因为编译器知道实际加载和存在哪些类   调用,它知道哪些方法可以去虚拟化和内联。   (值得注意的是,现代java编译器也知道如何“uncompile”   在之后加载重写方法的情况下的内联调用   JIT编译发生了。)

虽然我不明白为什么C ++编译器不能这样做。