具有可空值类型的as运算符是否不必要地慢?

Jep*_*sen 8 c# performance nullable as-operator

考虑以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

据我所看到的,方法FillUsingAsNullableFillUsingOwnCode应该是等价的.

但看起来"自己的代码"版本显然更快.

可以2选择编译"x86"或"x64",以及2编译"Debug"或"Release(optimizations)"的3选项,以及选择GetObject方法返回的内容.据我所知,在所有这些2*2*3 == 12情况下,"自己的代码"版本明显快于"as nullable"版本.

问题:是否asNullable<>不必要的缓慢,或者我在这里遗漏了一些东西(很有可能)?

相关主题:"as"和可空类型的性能惊喜.

小智 0

是的,as运算符是为了方便而不是性能,因此速度较慢。

更多信息可以参考这个回答:

“as”关键字在内部如何工作?