当我在chrome和nodejs中测试以下代码时,我得到以下信息:
Chrome:
for VAR循环: 24.058ms
for L循环: 8.402ms
的NodeJS:
for VAR循环: 4.329ms
for L循环: 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:不确定这不是测试性能的理想方式。
答案 0 :(得分:6)
v8版本随node.js 5.10 don't support temporal dead zone一起提供,用于let绑定。
Chrome正在使用支持它的V8 5.0 ......但由于vm尚未针对TDZ进行优化,因此现在速度较慢是正常的(我记得读过那些声称用let替换var的人使代码慢了约27%。
答案 1 :(得分:1)
当你这样做时
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
如果正确使用,显然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) });
}
将输出
0
1
2
3
3
3
3
3
3
就像在循环的每个循环中一样,i值i是唯一引用,这是导致轻微开销的原因,而对于其他两个循环则是相同的引用。
答案 2 :(得分:-1)
我不能告诉你更多但是在这个视频中提到(非常好),你需要更智能的代码来测试它。
https://www.youtube.com/watch?v=65-RbBwZQdU
编译器将使用您的代码 magic ,如果您不使用private void FrqSent()
{
int i = 1;
while (i <= 5)
{
i = i + 1;
}
}
并且循环为空,甚至可能会循环播放