假设我们有一些实现了接口I的类A

I i = new A();
i.method(); // example 1
A a = (A)i;
a.method() // example 2


每次对“ method()”的调用生成的IL代码是相同的,但是哪个方法“ method()”的调用在本机代码中花费更多,为什么?

任何帮助将不胜感激。

最佳答案

通常,正如JIT编译器(静态)知道应调用的具体方法一样,对((A)a).method()的调用将(稍稍)快一些,因此可以直接调用A.method。通过接口I调用它需要对引用所指向的对象的实际类型进行运行时检查,然后分派给该实现。我对此没有任何参考。

我确实知道Java JIT编译器在这方面进行了一些优化,因为每个方法调用都是虚拟的-它猜测并缓存了特定接口方法的最常用实现,并为此进行了优化。 .NET JIT几乎不需要如此,因为方法必须显式地是虚拟的。

这实际上是微优化的一种情况,您实际上不必担心。

08-25 08:32
查看更多