Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs和chrome中的let vs var性能_Javascript_Node.js_Performance_Google Chrome - Fatal编程技术网

Javascript nodejs和chrome中的let vs var性能

Javascript 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

当我在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 = 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