假设我们有一些类 A 实现了一些接口 I
I i = new A();
i.method(); // example 1
A a = (A)i;
a.method() // example 2
每次调用“method()”生成的 IL 代码是相同的,但是对方法“method()”的哪一个调用在本机代码中成本更高,为什么?
任何帮助将不胜感激。
假设我们有一些类 A 实现了一些接口 I
I i = new A();
i.method(); // example 1
A a = (A)i;
a.method() // example 2
每次调用“method()”生成的 IL 代码是相同的,但是对方法“method()”的哪一个调用在本机代码中成本更高,为什么?
任何帮助将不胜感激。
如果 IL 代码相同,则本机代码(成本)也相同。为什么 JIT 会以不同的方式对待它们?
通常,调用((A)a).method()
会(稍微)更快,因为 JIT 编译器(静态地)知道应该调用的具体方法,因此可以A.method
直接调用。通过接口调用它I
需要对引用指向的对象的实际类型进行运行时检查,然后分派到该实现。不过,我没有任何参考资料。
我确实知道 Java JIT 编译器在这方面进行了一些优化,因为每个方法调用都是虚拟的 - 它猜测并缓存特定接口方法的最常用实现并针对这种情况进行优化。.NET JIT 几乎不需要这个,因为方法必须是显式虚拟的。
这是一个非常重要的微优化案例,您真的不应该担心。