假设我们有一些实现某些接口i的类A

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

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

任何帮助将不胜感激。

有帮助吗?

解决方案

通常,呼吁 ((A)a).method() 正如JIT编译器所知道的(静态)应该调用的混凝土方法,将会更快(稍微稍微) A.method 直接地。通过接口调用 I 需要检查参考指向的对象的实际类型,然后派遣到该实现。不过,我没有任何参考。

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

这是 非常 您真的不必担心的是微观优化的情况。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top