2016-04-14 27 views
6

当我测试下面的铬和代码的NodeJS,我得到以下几点:让VS在VAR的NodeJS性能和铬

铬:

与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:不知道这是不是测试性能的理想方法。

+0

当我翻转测试顺序时,第一个(let)更快。大致相同的比例。 – ptrk

+0

您使用的是哪个版本的节点? – maioman

+0

@maioman使用v5.10 – BeingDev

回答

6

V8版本带有node.js的5.10 don't supporttemporal dead zone为let绑定。

Chrome改为使用支持它的V8 5.0 ...但由于vm尚未优化以处理TDZ,因此现在速度较慢是正常的(我记得读过那些断言将var替换为let代码大约慢27%)。

-1

我不能告诉你更多,但作为在这个视频(非常好)提到,你需要更聪明的代码来测试这个。 https://www.youtube.com/watch?v=65-RbBwZQdU 编译器会以魔法的东西与你的代码,甚至可能ereas的循环,如果你不使用i和环空

+0

难道是让我们表现正常,但只有var看起来很奇怪吗?既然“let”有类似的结果。 – Paran0a

+0

我不知道编译器做了什么,但它可能是因为let只为'for'作用域创建,但var也可以在外部使用 – yellowsir

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 

,其中清楚地让同样快的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值是唯一的参考,其是什么导致轻微的开销,而对于其他两个循环,它是相同的参考。