在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
,循环就是空的,甚至可能导致循环