9

我在阅读 Jon Skeet 的“C# in depth”第二版时偶然发现了“可空类型”一章中的一段话:

令人惊讶的性能陷阱我一直认为进行一次检查会比两次检查快,但似乎情况并非如此 - 至少对于我测试过的 .NET 版本。在编写一个快速基准测试,将“object []”类型数组中的所有整数相加,其中只有三分之一的值实际上是装箱整数,使用“is”,然后强制转换最终比使用“快 20 倍”作为'运营商。

乍一看,我认为编译器可能足够聪明,可以优化使用 'is' + cast 时发生的双重类型检查,但似乎并非如此。使用 32 位编译器编译并打开 /OPTIMIZE 标志的 .NET 4.0 代码仍会导致两个 MSIL 'isinst' 调用。

对于直觉上应该相反的情况,这种戏剧性的性能差异可能是什么解释?

4

0 回答 0