【问题标题】:Quantum Physics Of Java [closed]Java的量子物理学[关闭]
【发布时间】:2016-02-04 17:10:05
【问题描述】:

今天我看到了一张引人入胜的幻灯片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 毫秒,至少这是我的预期。但幻灯片的结论不同。谁能解释为什么我的代码可能会这样?

【问题讨论】:

  • 这可能是一个有趣的实验,但两个循环做的事情不同,所以你无法真正比​​较它们......
  • 比较做不同事情的两段代码的速度是错误的,因此你会被否决。
  • 实际上幻灯片上说两者同时运行(您可能预计第一个会慢 16 倍)。
  • @RBz 正如 Eran 所解释的,第二个循环做的工作更少,所以你会期望它在更短的时间内运行 - 你说第一个循环需要 8 毫秒,而第二个循环需要 1 毫秒,所以没有什么令人惊讶的那里。但是您链接的演示文稿说两个循环同时运行。所以我不确定你指的是哪张幻灯片,但你的问题似乎与令人困惑的演示文稿不符......

标签: java performance caching memory cpu


【解决方案1】:

这个blog post详细解释了这个现象。本质上:

  • 第一个循环的工作量是第二个循环的 6 倍
  • 但它们运行的​​时间相同(大致)

原因是第一个循环具有更好的缓存局部性,从而减少了缓存未命中。关于 SO 的主题有很多问题,例如:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多