在某些perf关键程序(单线程)中,如果我有基本类型的数组,并且需要在循环中多次访问那些相同的索引。
我应该使用tmp变量,还是只是对数组的常量间接更好/更快?
我还可以想象,在编译时它们可能是相同的/是透明优化的。
答案 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)
数组访问总是涉及间接,因此如果频繁访问,变量可能会更快。
那就是说,我发现你很难衡量差异。这是微优化的一个例子。