我正在看这个视频"我们是怎么来到这里的?"由马丁汤普森的机械同情。 (http://m.youtube.com/watch?v=oxjT7veKi9c)
他声称要使用L0缓存,有时候最好有两个小循环而不是一个大循环,即使我们可能要两次通过同一个列表。
有可能吗?无论如何要用测量来创建一个简单的示例代码来演示这个?
答案 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]
之间,并跟踪添加的位置。
如果a
和b
很复杂,编译器可能无法在寄存器中保存对它们的引用。
结果可能是这个"上下文切换",因为它必须在每次迭代时完成,需要比额外循环的成本更多的指令周期。
(展开后,情况更是如此。)
这仍然没有考虑缓存问题。
答案 1 :(得分:0)
"有时",也许。如果循环体可以被拆分成没有太多开销的部分,而不是执行指令的总数,无论是在两个小循环中还是在一个大循环中,都可能几乎相同。无论如何,数据缓存在遍历输入时都会有所帮助。
但我怀疑这个技巧在一般情况下是否真的有用。