我是否应该在关键代码中使用C#中的数组中的变量或多个间接?

时间:2012-02-21 15:57:11

标签: c# performance

在某些perf关键程序(单线程)中,如果我有基本类型的数组,并且需要在循环中多次访问那些相同的索引。

我应该使用tmp变量,还是只是对数组的常量间接更好/更快?

我还可以想象,在编译时它们可能是相同的/是透明优化的。

3 个答案:

答案 0 :(得分:4)

让我们测试一下:

  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

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

答案 1 :(得分:3)

一般中对数组的访问速度比临时速度慢,因为它有2个额外的开销

  • 间接层
  • 边界检查

但是我会根据这些知识更改我今天拥有的任何代码,除非探查器清楚地显示了一个紧密的循环,成为我的应用程序中的重要性能问题。并且进一步表明,改变到缓存的本地产生了显着的性能益处。

答案 2 :(得分:2)

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

那就是说,我发现你很难衡量差异。这是微优化的一个例子。