两个小循环能比一个大循环快吗?



我在看这个视频《我们是怎么走到这一步的?》(http://m.youtube.com/watch?v=oxjT7veKi9c)

他声称,为了利用L0缓存,有时使用两个小循环比使用一个大循环要好,即使我们可能需要遍历同一个列表两次。

有可能吗?无论如何,创建一个微不足道的示例代码与测量来演示这一点?

简单示例:

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比较复杂,编译器可能无法在寄存器中同时保存对它们的引用。结果可能是这种"上下文切换",因为它必须在每次迭代中完成,因此需要更多的指令周期,而不是额外循环的成本。(如果展开,就更正确了。)

这还没有考虑缓存问题

"有时",也许。如果循环体可以在没有太多开销的情况下分成几个部分,那么在两个小循环或一个大循环中执行的指令总数可能几乎相同。当遍历两次输入时,数据缓存是有帮助的。

最新更新