为什么 for(var i = 0; i < 600000000000; i++) {} 在 JavaScript 中运
Why does for(var i = 0; i < 600000000000; i++) {} runs so long in JavaScript
我时不时地使用 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
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 在指令控制器中使用$attrs时出现问题
- 可以't让我的if语句处理js中的html表单输入
- 防止Iframe窗体在新窗口中打开
- 如何使用url加载程序在webpack中导入多个图像
- 使用php或javascript从facebook相册URL中删除多余的部分
- 引用对象中的通用值
- 如何在映射数组中添加换行符
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 用程序搜索JQuery数据表中的文本
- 要求输入在数据列表中
- 在循环中分配json值时,值被覆盖
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 如何在Angular2中使用jQuery插件
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 在VanillaJS中模拟模型双向数据绑定
- 无法在通过jQuery的ajax加载的页面中执行javascript
- 为什么 for(var i = 0; i < 600000000000; i++) {} 在 JavaScript 中运
- Firefox ONLY不会在if语句中运行一行javascript代码,但会运行其他行——chrome和safari运