C#编译器不会优化不必要的强制转换

Ste*_*ven 30 c# compiler-construction performance cil

几天前,虽然在溢出时写了这个问题的答案,我对C#编译器感到有些惊讶,他没有做我预期的事情.请查看以下代码片段:

第一:

object[] array = new object[1];

for (int i = 0; i < 100000; i++)
{
    ICollection<object> col = (ICollection<object>)array;
    col.Contains(null);
}
Run Code Online (Sandbox Code Playgroud)

第二:

object[] array = new object[1];

for (int i = 0; i < 100000; i++)
{
    ICollection<object> col = array;
    col.Contains(null);
}
Run Code Online (Sandbox Code Playgroud)

两个片段之间代码的唯一区别是对ICollection <object>的强制转换.因为object []显式地实现了ICollection <object>接口,所以我期望这两个片段编译成相同的IL,因此是相同的.然而,当对它们进行性能测试时,我注意到后者的速度是前者的6倍.

在比较两个片段中的IL之后,我注意到两种方法都是相同的,除了第一个片段中的castclass IL指令.

对此感到惊讶,我现在想知道为什么C#编译器在这里并不"聪明".事情从来没有像看起来那么简单,为什么C#编译器在这里有点天真?

Eri*_*ert 32

我的猜测是你在优化器中发现了一个小错误.数组中有各种特殊情况代码.谢谢你引起我的注意.

  • 只有埃里克可以发布一个答案,说"哎呀,我们做了一个嘘声"并获得10个赞成票.优秀!;) (18认同)