9

可能重复:
为什么接口方法调用比具体调用慢?

我最近有机会出现在一个面试中,面试官问Abstract classInterface哪个更快。虽然我对这个问题感到困惑,但我回答接口主要是因为我认为后期绑定概念会导致抽象类的性能延迟。在网上探索了同样的问题之后,我开始知道抽象方法更快,尽管根据一些博客接口方法更快。我有点困惑,所以我想问这个问题以正确理解哪个更快以及为什么有充分的理由。

根据以下内容,Abstract 类速度很快,但没有正当理由。 http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

4

2 回答 2

12

答案取决于编程语言,可能还取决于您使用的编译器。在使用运行时优化的 Java VM 等环境中,可能根本无法回答。老实说,在一个典型的 Java 项目中,没有人关心,因为即使存在差异,它也会非常小,不会显着降低您的软件速度。除非您有严格的实时约束,否则您不会使用 Java(并且可能根本没有多态性)。

基本上,接口方法和抽象方法都使用动态调度,所以如果有的话,差别很小。在没有太多细节知识的情况下,我假设理论上,只要语言不为类实现多重继承,抽象方法的调度速度就会更快。方法指针在调度向量中的位置是静态的,而不是接口方法(一个类通常可以实现多个接口)。

但正如我所说,我不知道编译器中发生的事情的细节。可能还有其他我没有想到的因素。如果我必须在采访中回答这个问题,我会引用 Don Knuth 的“过早优化是万恶之源”。

于 2012-09-20T14:24:25.267 回答
0

这个问题的最佳答案是“我会写一个小测试来找出,如果我真的,真的需要”。获取一个真实示例并在受控条件下运行它,其中两个实现仅在接口与抽象类方面有所不同。如果没有具体的实现,“哪个更快”的问题毫无意义。面试官要么试图炫耀(并且可能不知道实际答案),要么试图测试你的批判性思维能力(这个问题有意义吗?),或者非常挑剔。

The first rule of optimization is do not optimize... yet. The second rule is to profile your program to find bottlenecks before any refactoring: a change of algorithm or data-structure the right place is often the only thing that is needed; and I am willing to bet that in, say, Java, the hotspot compiler will make any difference between abstract and interface, if any, truly hard to find indeed.

于 2012-09-21T00:00:41.827 回答