Javascript nodejs和chrome中的let vs var性能
当我在chrome和nodejs中测试以下代码时,我得到以下结果: 铬: 对于带有VAR的环路:24.058msJavascript nodejs和chrome中的let vs var性能,javascript,node.js,performance,google-chrome,Javascript,Node.js,Performance,Google Chrome,当我在chrome和nodejs中测试以下代码时,我得到以下结果: 铬: 对于带有VAR的环路:24.058ms 对于带LET的环路:8.402ms NodeJS: 对于带有VAR的循环:4.329ms 对于带LET的环路:8.727ms 根据我的理解,由于块作用域,所以在chrome中LET的速度更快。但是有人能帮我理解为什么它在NodeJS中是相反的吗? 还是我遗漏了什么 "use strict"; console.time("for loop with VAR"); for (var i
对于带LET的环路:8.402ms NodeJS: 对于带有VAR的循环:4.329ms
对于带LET的环路:8.727ms 根据我的理解,由于块作用域,所以在chrome中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");`
“严格使用”;
控制台时间(“对于带VAR的循环”);
对于(变量i=0;i<1000000;i+=1){
//无所事事
}
console.timeEnd(“用于带VAR的循环”);
控制台时间(“带LET的循环”);
对于(设i=0;i<1000000;i+=1){
//无所事事
}
console.timeEnd(“带LET的for循环”);`
PS:不确定这是否是测试性能的理想方法 我不能告诉您更多,但正如本视频中提到的(非常好),您需要更智能的代码来测试这一点。
如果您不使用
i
,并且循环为空,编译器将在您的代码中添加神奇的东西,甚至可能重新生成循环
Chrome使用的是支持它的V8 5.0…但由于虚拟机尚未优化以处理TDZ,目前速度较慢是正常的(我记得有人断言用let替换var会使代码慢27%。
for (let i = 0; i < 1000000; i += 1) { }
显然,正确使用时,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) });
}
在let i的每个循环中,i值都是唯一的引用,这是导致轻微开销的原因,而对于其他两个循环,它是相同的引用。可能是let行为正常,但只有var看起来很奇怪吗?因为两个“let”都有相似的结果。我不知道编译器会做什么,但可能是因为let只为
for
范围创建,但是var也可以在外部使用。当我翻转测试顺序时,第一个(let)更快。以大致相同的比例。您使用的是哪个版本的node?@maioman使用v5.10这样的测试的问题是(至少在原则上)运行时优化可能会发现代码没有任何副作用,而只是不这样做。让循环实际做一些事情(便宜的事情),看看这有什么不同。我的观点是,开销的差异可能完全被代码实际工作的成本所掩盖。
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
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