2016-04-14 28 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值是唯一的參考,其是什麼導致輕微的開銷,而對於其他兩個循環,它是相同的參考。