Java 的量子物理学
Quantum Physics Of Java
今天我看到了一张有趣的幻灯片 here。它比较了下面给出的两个 for 循环。
第一个
for (int i=0; i<n; i++) {
a[i] * = 3;
}
第二
for (int i=0; i<n; i+=16) {
a[i] * = 3;
}
如果第一个循环需要 8 毫秒,那么第二个循环应该只需要 1 毫秒,至少这是我的预期。但幻灯片的结论不同。任何人都可以解释为什么我的代码可能会这样吗?
这篇blog post详细解释了这个现象。本质上:
- 第一个循环比第二个循环多做 6 倍的工作
- 但他们 运行 在相同的时间内(大致)
原因是第一个循环具有更好的缓存局部性,从而减少了缓存未命中。 SO 上有很多关于这个主题的问题,例如:
- What is "cache-friendly" code?
- Spacial Locality in loops
今天我看到了一张有趣的幻灯片 here。它比较了下面给出的两个 for 循环。
第一个
for (int i=0; i<n; i++) {
a[i] * = 3;
}
第二
for (int i=0; i<n; i+=16) {
a[i] * = 3;
}
如果第一个循环需要 8 毫秒,那么第二个循环应该只需要 1 毫秒,至少这是我的预期。但幻灯片的结论不同。任何人都可以解释为什么我的代码可能会这样吗?
这篇blog post详细解释了这个现象。本质上:
- 第一个循环比第二个循环多做 6 倍的工作
- 但他们 运行 在相同的时间内(大致)
原因是第一个循环具有更好的缓存局部性,从而减少了缓存未命中。 SO 上有很多关于这个主题的问题,例如:
- What is "cache-friendly" code?
- Spacial Locality in loops