次のコードを検討してください。
static void FillUsingAsNullable()
{
int?[] arr = new int?[1 << 24];
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < arr.Length; ++i)
arr[i] = GetObject() as int?;
Console.WriteLine("{0:N0}", sw.ElapsedTicks);
}
static void FillUsingOwnCode()
{
int?[] arr = new int?[1 << 24];
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < arr.Length; ++i)
{
object temporary = GetObject();
arr[i] = temporary is int ? (int?)temporary : null;
}
Console.WriteLine("{0:N0}", sw.ElapsedTicks);
}
static object GetObject()
{
//Uncomment only one:
//return new object();
//return 42;
//return null;
}
私が見る限り、メソッドFillUsingAsNullable
とメソッドFillUsingOwnCode
は同等であるはずです。
しかし、「独自のコード」バージョンの方が明らかに速いようです。
2
「x86」または「x64」をコンパイルするための選択肢、および「2
デバッグ」または「リリース (最適化)」をコンパイルするための選択肢、およびメソッド3
で何を返すかの選択肢があります。GetObject
私が見る限り、これらすべての2*2*3 == 12
ケースで、「独自のコード」バージョンは「null 許容」バージョンよりも大幅に高速です。
質問:不必要as
にNullable<>
遅いですか、それともここに何かが欠けていますか(かなりの可能性があります)?
関連スレッド: 「as」および null 許容型によるパフォーマンスの驚き.