C#调用方法类/接口(本机代码,成本)

时间:2010-04-26 13:56:43

标签: c# .net class interface native-code

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

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

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

这非常一个微观优化的案例,你真的不应该担心。