2

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

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

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

任何帮助将不胜感激。

4

2 回答 2

2

如果 IL 代码相同,则本机代码(成本)也相同。为什么 JIT 会以不同的方式对待它们?

于 2010-04-26T14:04:26.940 回答
1

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

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

这是一个非常重要的微优化案例,您真的不应该担心。

于 2010-04-26T14:05:14.023 回答