在性能关键代码中,我应该更喜欢C#中的变量还是数组上的多个间接寻址

本文关键字:变量 数组 间接寻址 性能 代码 更喜欢 我应该 | 更新日期: 2023-09-27 18:25:31

在一些性能关键型程序(单线程)中,如果我有基元类型的数组,并且需要在循环中多次访问这些基元的同一索引。

我应该使用tmp变量,还是只对数组进行常量间接寻址会更好/更快?

我还可以想象,两者都有可能是相同的/在编译时进行了透明的优化。

在性能关键代码中,我应该更喜欢C#中的变量还是数组上的多个间接寻址

让我们测试一下:

  int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
  int t = arr[3];
  int a = 0;
  var start = DateTime.UtcNow;
  for (int i = 0; i < 1000000000; i++)
  {
    a += t;
  }
  Console.WriteLine(a);
  Console.WriteLine(DateTime.UtcNow-start);
  a = 0;
  start = DateTime.UtcNow;
  for (int i = 0; i < 1000000000; i++)
  {
    a += arr[3];
  }
  Console.WriteLine(a);
  Console.WriteLine(DateTime.UtcNow - start);

输出:

-294967296
00:00:02.1925000
-294967296
00:00:03.4250000

是的,重复访问阵列的速度较慢。

常规中,对数组的访问比临时访问慢,因为它有2个额外的开销

  • 间接层
  • 边界检查

然而,我不会基于这些知识更改我今天的任何代码,除非探查器清楚地显示出我的应用程序中存在严重的性能问题。此外还表明,更改为缓存的本地会产生显著的性能优势。

数组访问总是涉及间接访问,因此如果频繁访问,变量可能会更快。

也就是说,我发现你不太可能测量出差异。这是一个微观优化的例子。