内存访问比较

时间:2016-07-12 11:42:56

标签: c++ arrays memory

2中哪一个更快(C ++)?

for(i=0; i<n; i++)
{
    sum_a = sum_a + a[i];
    sum_b = sum_b + b[i];
}

或者

for(i=0; i<n; i++)
{
    sum_a = sum_a + a[i];
}
for(i=0; i<n; i++)
{
    sum_b = sum_b + b[i];
}

我是初学者,所以我不知道这是否有意义,但在第一个版本中,数组&#39; a&#39;因为数组&#39; a&#39;和&#39; b&#39;在不同的记忆位置。但在第二个版本中,整个数组&#39; a&#39;首先访问,然后访问整个数组&#39;这意味着访问连续的存储器位置而不是在两个数组之间交替。

两个版本的执行时间(即使是非常微不足道的版本)之间是否存在差异?

2 个答案:

答案 0 :(得分:4)

我认为这个问题没有正确答案。通常,第二个版本的迭代次数(CPU执行开销)增加了两倍,但访问内存的次数更少(内存访问开销)。现在假设您在具有慢速时钟的PC上运行此代码,但是缓存非常好。内存开销减少了,但由于时钟运行缓慢,因此同一循环两次使执行时间更长。其他方面:快速时钟,但内存不好 - 运行两个循环不是问题,因此最好优化内存访问。

以下是有关如何配置应用的简单示例:Link

答案 1 :(得分:3)

  

2中哪一个更快(C ++)?

要么。这取决于

  • operator+operator[]的实施(如果它们超载)
  • 阵列在内存中的位置(相邻或不相邻)
  • 数组的大小
  • cpu缓存的大小
  • 缓存的相关性
  • 与内存速度相关的缓存速度
  • 可能是其他因素

正如Revolver_Ocelot在a comment的观察中所提到的,一些编译器甚至可能将书面循环转换为另一种形式。

  

两个版本的执行时间(即使是非常微不足道的版本)之间是否存在差异?

它可以有所作为。差异可能很大或可以忽略不计。

您的分析是合理的。内存访问通常比缓存慢得多,在某些情况下,在两个内存位置之间跳转可能会导致缓存颠簸。我建议默认情况下使用分离的方法,只有在测量到目标CPU的速度更快的情况下才能组合循环。

因为MSalters points out颠簸不应该成为现代桌面处理器的问题(现代~~86)。