为什么 for(var i = 0; i < 600000000000; i++) {} 在 JavaScript 中运

Why does for(var i = 0; i < 600000000000; i++) {} runs so long in JavaScript

本文关键字:中运 i++ 600000000000 JavaScript for var 为什么      更新时间:2023-09-26

我时不时地使用 JS 来解决欧拉项目的任务。对于其中一项任务,我必须迭代大约 6000 亿个连续数字。令我惊讶的是,在 NodeJS 中花了大约 14 个小时。

只需运行下面的代码片段,您的浏览器就会卡住几个小时(我尝试了 Chrome 和 Firefox):

console.time('t')
for (var i = 0; i < 600851475143; i++) {}
console.timeEnd('t')

相比之下,在 Java 中,它在我的机器上运行大约 200 毫秒,如果我计算每个i的平方根,则需要 4 秒。

发生了什么事情???

更新:我知道迭代每个数字并不是解决这个特殊 PE 问题的正确方法。问题不在于此。

更新 2:我对Java有误解。正如人们正确指出的那样,它只是在物理上不能跑得这么快。我只是用错了号码,对不起。

首先,200ms 和 4 秒都是完全荒谬的,因为您的处理器很可能每秒最多只能执行 40 亿个周期 (4 GHz),即使一次循环迭代花费 1 个周期,它仍然需要至少 150 秒。然而,即使是一个空循环,每次迭代至少要花费 3 个周期(假设它没有优化),计算平方根每次迭代会增加 5-10 个,所以你根本没有在 4 秒内完成 6000 亿个平方根。

而且我什至无法重现,以下内容需要永远按预期运行:

class Test {
    public static void main(String[] args) {
        for (long i = 0; i < 600851475143L; ++i) {
        }
    }
}

然后

$ java -version
java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
$ javac test.java
$ java -cp . Test