在性能关键代码中,我应该更喜欢C#中的变量还是数组上的多个间接寻址
本文关键字:变量 数组 间接寻址 性能 代码 更喜欢 我应该 | 更新日期: 2023-09-27 18:25:31
在一些性能关键型程序(单线程)中,如果我有基元类型的数组,并且需要在循环中多次访问这些基元的同一索引。
我应该使用tmp变量,还是只对数组进行常量间接寻址会更好/更快?
我还可以想象,两者都有可能是相同的/在编译时进行了透明的优化。
让我们测试一下:
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个额外的开销
- 间接层
- 边界检查
然而,我不会基于这些知识更改我今天的任何代码,除非探查器清楚地显示出我的应用程序中存在严重的性能问题。此外还表明,更改为缓存的本地会产生显著的性能优势。
数组访问总是涉及间接访问,因此如果频繁访问,变量可能会更快。
也就是说,我发现你不太可能测量出差异。这是一个微观优化的例子。