在nodejs和chrome中使用vs var性能

时间:2016-04-14 12:40:47

标签: javascript node.js performance google-chrome

当我在chrome和nodejs中测试以下代码时,我得到以下信息:

Chrome:

  

for VAR循环: 24.058ms
  for L循环: 8.402ms

的NodeJS:

  

for VAR循环: 4.329ms
  for L循环: 8.727ms

根据我的理解,由于块范围LET在chrome中更快。但有人可以帮助我理解为什么它在NodeJS中是相反的? 或者我错过了什么?

"use strict";
console.time("for loop with VAR");
for (var i = 0; i < 1000000; i += 1) {
 // Do nothing
}
console.timeEnd("for loop with VAR");

console.time("for loop with LET");
for (let i = 0; i < 1000000; i += 1) {
 // Do nothing
}
console.timeEnd("for loop with LET");` 

PS:不确定这不是测试性能的理想方式。

3 个答案:

答案 0 :(得分:6)

v8版本随node.js 5.10 don't support temporal dead zone一起提供,用于let绑定。

Chrome正在使用支持它的V8 5.0 ......但由于vm尚未针对TDZ进行优化,因此现在速度较慢是正常的(我记得读过那些声称用let替换var的人使代码慢了约27%。

答案 1 :(得分:1)

当你这样做时

for (let i = 0; i < 1000000; i += 1) { }

每个循环周期中的i值是一个单独的引用,在异步回调中使用i值时非常有用。这比较慢,但在这种使用情况下可能比其他选择更快。

而是使用

let j;
for (j = 0; j < 1000000; ++j) { }

您将只有一个值引用,它将与var。

一样快

尝试以下代码

console.time("let i");
for (let i = 0; i < 10000000; ++i) { }
console.timeEnd("let i");
console.time("let j");
let j;
for (j = 0; j < 10000000; ++j) { }
console.timeEnd("let j");
console.time("var k");
for (var k = 0; k < 10000000; ++k) { }
console.timeEnd("var k");

这会产生类似

的结果
let i: 91ms
let j: 25ms
var k: 27ms

如果正确使用,显然let对var同样快。

另外,要了解异步行为的区别,请尝试

for (let i = 0; i < 3; ++i) {
    setImmediate(() => { console.log(i) });
}
let j;
for (j = 0; j < 3; ++j) {
    setImmediate(() => { console.log(j) });
}
for (var k = 0; k < 3; ++k) {
    setImmediate(() => { console.log(k) });
}

将输出

0
1
2
3
3
3
3
3
3

就像在循环的每个循环中一样,i值i是唯一引用,这是导致轻微开销的原因,而对于其他两个循环则是相同的引用。

答案 2 :(得分:-1)

我不能告诉你更多但是在这个视频中提到(非常好),你需要更智能的代码来测试它。 https://www.youtube.com/watch?v=65-RbBwZQdU 编译器将使用您的代码 magic ,如果您不使用private void FrqSent() { int i = 1; while (i <= 5) { i = i + 1; } } 并且循环为空,甚至可能会循环播放