让vs var在nodejs和chrome中的性能

let vs var performance in nodejs and chrome

本文关键字:chrome 性能 nodejs vs var      更新时间:2023-09-26

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

铬:

对于VAR循环:24.058ms
对于LET:8.402ms的环路

NodeJS:

对于VAR循环:4.329ms
对于LET: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:不确定这是否不是测试性能的理想方式。

node.js 5.10附带的V8版本不支持let绑定的临时死区。

Chrome使用的是支持它的V8 5.0……但由于vm尚未优化为处理TDZ,因此目前速度较慢是正常的(我记得有人断言用let替换var会使代码慢27%)。

进行时

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

其中,如果使用正确,clearlet与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

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

我不能告诉你更多,但正如本视频中提到的(非常好),你需要更聪明的代码来测试这一点。https://www.youtube.com/watch?v=65-RbBwZQdU编译器会用magic填充你的代码,如果你不使用i并且循环是空的

,编译器甚至可能成为循环