【发布时间】:2014-12-05 12:00:50
【问题描述】:
我时不时地使用 JS 来解决 Project Euler 上的任务。对于其中一项任务,我必须迭代大约 6000 亿个连续数字。令我惊讶的是,在 NodeJS 中花了大约 14 个小时。
只需运行下面的 sn-p,您的浏览器就会卡住几个小时(我尝试过 Chrome 和 Firefox):
console.time('t')
for (var i = 0; i < 600851475143; i++) {}
console.timeEnd('t')
作为比较,在 Java 中它在我的机器上运行大约 200 毫秒,如果我计算每个 i 的平方根,则需要 4 秒。
发生了什么???
更新: 我知道迭代每个数字并不是解决这个特殊的 PE 问题的正确方法。问题不在于那个。
更新 2: 我误解了Java。正如人们正确指出的那样,它只是物理上无法运行得这么快。我只是用错了号码,对不起。
【问题讨论】:
-
JVM 很可能完全消除了整个
for语句,因为它不会产生任何副作用。而且 V8 还没有那么智能(还) -
@zerkms 仔细阅读:如果我在每次迭代中计算当前 i 的平方根,JVM 运行 4 秒。
-
仔细制作您的示例 - 在您的示例中这是一个空的主体循环。
-
@GeorgiyIvankin 实际上是什么任务?
-
@Georgiy Ivankin:“为什么在 JVM 上计算直到这个数字的每个平方根都需要 4 秒?” --- JVM 是令人难以置信的复杂玩具。它可能会将您的循环扩展为单个或多个表达式,或进行其他优化。如果它“不是立即”运行,并不意味着它执行了 600851475143 次操作。
标签: javascript performance for-loop v8 gecko