考虑这段代码:
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
情况下,“自己的代码”版本明显快于“可空”版本。
问题:是不必要的as
慢Nullable<>
,还是我在这里遗漏了什么(很可能)?
相关线程:“as”和可空类型的性能惊喜。