在nodejs和chrome中让vs性能

当我在chrome和nodejs中testing以下代码时,我得到以下内容:

铬:

for循环VAR: 24.058ms
用于LET的循环: 8.402ms

的NodeJS:

for循环VAR: 4.329ms
for循环与LET: 8.727ms

根据我的理解,由于块范围LET是更快的铬。 但有人可以帮我理解为什么它在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:不知道这是不是testing性能的理想方法。

带有node.js 5.10的V8版本不支持用于绑定的临时死区 。

Chrome改为使用支持它的V8 5.0 …但是由于vm还没有优化来处理TDZ,现在是正常的,现在速度较慢(我记得读过那些声称replacevar的人,让代码大约慢了27% )。

当你这样做

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

每个循环周期中的i值是一个单独的引用,在asynchronouscallback中使用i值时非常有用。 这比较慢,但在这个用例中可以比其他select更快。

反而使用

 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 

在正确使用的情况下,明显让var同样快。

也要看asynchronous行为的差异,请尝试

 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值是一个唯一的引用,这是引起轻微开销的原因,而对于其他两个循环,引用是相同的。

我不能告诉你更多,但在这个video(非常好)提到,你需要更聪明的代码来testing这个。 编译器会将你的代码变成魔法东西,如果你不使用i ,循环就是空的,甚至可能导致循环