我在看这个视频《我们是怎么走到这一步的?》(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]
之间"切换上下文",并跟踪加法的位置。如果a
和b
比较复杂,编译器可能无法在寄存器中同时保存对它们的引用。结果可能是这种"上下文切换",因为它必须在每次迭代中完成,因此需要更多的指令周期,而不是额外循环的成本。(如果展开,就更正确了。)
这还没有考虑缓存问题
"有时",也许。如果循环体可以在没有太多开销的情况下分成几个部分,那么在两个小循环或一个大循环中执行的指令总数可能几乎相同。当遍历两次输入时,数据缓存是有帮助的。