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;这意味着访问连续的存储器位置而不是在两个数组之间交替。
两个版本的执行时间(即使是非常微不足道的版本)之间是否存在差异?
答案 0 :(得分:4)
我认为这个问题没有正确答案。通常,第二个版本的迭代次数(CPU执行开销)增加了两倍,但访问内存的次数更少(内存访问开销)。现在假设您在具有慢速时钟的PC上运行此代码,但是缓存非常好。内存开销减少了,但由于时钟运行缓慢,因此同一循环两次使执行时间更长。其他方面:快速时钟,但内存不好 - 运行两个循环不是问题,因此最好优化内存访问。
以下是有关如何配置应用的简单示例:Link
答案 1 :(得分:3)
2中哪一个更快(C ++)?
要么。这取决于
operator+
和operator[]
的实施(如果它们超载)正如Revolver_Ocelot在a comment的观察中所提到的,一些编译器甚至可能将书面循环转换为另一种形式。
两个版本的执行时间(即使是非常微不足道的版本)之间是否存在差异?
它可以有所作为。差异可能很大或可以忽略不计。
您的分析是合理的。内存访问通常比缓存慢得多,在某些情况下,在两个内存位置之间跳转可能会导致缓存颠簸†。我建议默认情况下使用分离的方法,只有在测量到目标CPU的速度更快的情况下才能组合循环。
†因为MSalters points out颠簸不应该成为现代桌面处理器的问题(现代~~86)。