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