Jon Skeet の「C# の詳細」第 2 版を読んでいるときに、「Nullable 型」の章の段落に出くわしました。
驚くべきパフォーマンスのトラップ私は常に、1 回のチェックを行う方が 2 回よりも高速であると考えていましたが、そうではないようです - 少なくとも私がテストした .NET のバージョンではそうではありません。'object[]' 型の配列内のすべての整数を合計する簡単なベンチマークを作成するとき、値の 3 分の 1 だけが実際にはボックス化された整数であり、'is' を使用してキャストすると、 ' as' 演算子。
一見、「is」+キャストを使用したときに発生する二重の型チェックを最適化するのに十分なほどコンパイラが賢いのではないかと思いましたが、そうではないようです。/OPTIMIZE フラグをオンにして 32 ビット コンパイラでコンパイルされた .NET 4.0 コードでも、2 つの MSIL 'isinst' 呼び出しが発生しました。
直感的には逆になるはずのケースで、このような劇的なパフォーマンスの違いを説明するにはどうすればよいでしょうか?