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