今天我遇到了一个引人入胜的幻灯片here。它比较了下面给出的两个循环。
第一
for (int i=0; i<n; i++) {
a[i] * = 3;
}
第二
for (int i=0; i<n; i+=16) {
a[i] * = 3;
}
如果第一个循环需要8ms,那么第二个循环应该只花1ms,至少这是我的预期。但幻灯片的结论不同。任何人都可以解释为什么我的代码可能会像这样?
答案 0 :(得分:2)
这blog post详细解释了这一现象。基本上:
原因是第一个循环具有更好的缓存局部性,从而减少了缓存未命中。有关SO的主题有很多问题,例如: