Google chrome vs nodejs(v8)的性能?
Posted
技术标签:
【中文标题】Google chrome vs nodejs(v8)的性能?【英文标题】:Performance of Google chrome vs nodejs (v8)? 【发布时间】:2015-06-05 22:22:33 【问题描述】:示例
console.time("Test");
for(var i=0; i <2500000; i +=1 )
// loop around
console.timeEnd("Test");
上面的代码在nodejs
中运行faster
而不是google chrome
。为什么 node.js 比谷歌浏览器更快,两者都使用chrome v8
引擎
注意
平均速度
Google Chrome - 1518.021ms
Node.js - 4 ms
知道执行速度的不同吗?
【问题讨论】:
这些性能测试你做的怎么样?你如何在 Chrome 中运行 javascript? 在您的简单示例中,循环最终什么都不做,只是将变量i
从 0 更改为几百万。 V8 引擎的 JIT 编译器会优化这样的部分,如果能得到相同的结果,甚至可能根本不运行循环。如您所见,这将取决于运行 JS 的环境。这是关于性能和基准测试的相关 JS 演讲:youtube.com/watch?v=65-RbBwZQdU
但是当我在 nodejs 和 chrome 中尝试下面的代码时,chrome 需要 522 ms 而 nodejs 需要 2277 ms。这意味着铬更快。函数 test() const startTime = new Date().getTime(); for(var i=0;i
【参考方案1】:
在网络浏览器 (Chrome) 中,在任何函数范围之外声明变量 i 会使其成为全局变量,因此会绑定到 window 对象。因此,在网络浏览器中运行此代码需要在 for 循环的每次迭代中重复解析大量填充的窗口命名空间中的属性。
然而,在 Node.js 中,声明任何函数范围之外的任何变量只会将其绑定到 module 范围(而不是窗口对象),因此更容易并且更快地解决。
当我们将上述代码包装在函数中时,我们将获得或多或少相同的执行速度。
【讨论】:
还要注意如何通过使用let i
而不是var i
获得显着的加速,这使它成为一个局部变量。【参考方案2】:
这是由于 JavaScript 中的 SCOPE
在浏览器控制台无范围的代码:花费很多时间:测试:1154.19ms
以下代码将保存在大量填充的窗口对象中,这需要时间来解决;
console.time("Test");
for(var i=0; i <2500000; i +=1 )
// loop around
console.timeEnd("Test");
在浏览器控制台代码范围:花费更少时间测试:3.06ms
以下代码将保留在 JavaScript 范围内,范围几乎是空的因此时间更短
function rocket()
console.time("Test");
for(var i=0; i <2500000; i +=1 )
// loop around
console.timeEnd("Test");
rocket()
在 Nodejs REPL 中:没有范围的代码:测试:14ms
出乎意料但是nodejs最外面的范围包含一些变量
console.time("Test");
for(var i=0; i <2500000; i +=1 )
// loop around
console.timeEnd("Test");
在 Nodejs REPL 中:代码范围:测试:2ms
以下代码将保留在 JavaScript 范围内,范围几乎是空的因此时间更短
function rocket()
console.time("Test");
for(var i=0; i <2500000; i +=1 )
// loop around
console.timeEnd("Test");
rocket()
结论:这都是由于JavaScript中的SCOPE和SCOPING是由函数完成的
表示如果你创建新函数,大括号内的place被称为SCOPE,它最初是空的,并且如果您在此范围内创建变量,则不会花费任何时间来执行
【讨论】:
【参考方案3】:现在远没有那么戏剧化,但在您的测试中,我确实得到了 2 倍的提升,从 5.417 毫秒降低到 2 毫秒。当我使用更大的循环和函数包装时,我在 Node 和 Chrome 上的值几乎完全相同。
(function()
console.time("Test");
for(var i=0; i <10000000000; i +=1 )
// loop around
console.timeEnd("Test");
).call(this);
【讨论】:
以上是关于Google chrome vs nodejs(v8)的性能?的主要内容,如果未能解决你的问题,请参考以下文章
json对象上的多属性检查三元运算符在nodejs中不起作用,而它在google chrome控制台中工作
Google Translate web 提供了两种不同的翻译(chrome browser vs Selenium/chromedriver)