2个小循环可以比大循环快吗?

时间:2015-09-20 13:12:21

标签: performance loops cpu-cache

我正在看这个视频"我们是怎么来到这里的?"由马丁汤普森的机械同情。 (http://m.youtube.com/watch?v=oxjT7veKi9c

他声称要使用L0缓存,有时候最好有两个小循环而不是一个大循环,即使我们可能要两次通过同一个列表。

有可能吗?无论如何要用测量来创建一个简单的示例代码来演示这个?

2 个答案:

答案 0 :(得分:1)

简单示例:

double sum1 = 0, sum2 = 0;
for (i = n; --i >= 0;){
  sum1 += a[i];
  sum2 += b[i];
}

反对:

double sum1 = 0, sum2 = 0;
for (i = n; --i >= 0;){
  sum1 += a[i];
}
for (i = n; --i >= 0;){
  sum2 += b[i];
}

在第一个例子中,编译器必须生成代码以切换上下文"索引a[i]b[i]之间,并跟踪添加的位置。 如果ab很复杂,编译器可能无法在寄存器中保存对它们的引用。 结果可能是这个"上下文切换",因为它必须在每次迭代时完成,需要比额外循环的成本更多的指令周期。 (展开后,情况更是如此。)

这仍然没有考虑缓存问题。

答案 1 :(得分:0)

"有时",也许。如果循环体可以被拆分成没有太多开销的部分,而不是执行指令的总数,无论是在两个小循环中还是在一个大循环中,都可能几乎相同。无论如何,数据缓存在遍历输入时都会有所帮助。

但我怀疑这个技巧在一般情况下是否真的有用。