2016-04-25 13 views
3

速いtest1のテストよりも高速である理由

'use strict' 
 

 
function test() { 
 
    let t = Date.now(); 
 
    let p = 0; 
 
    for (let i = 0; i < 100000000; i++) { 
 
    p += i % 2; 
 
    } 
 
    console.log(p) 
 
    console.log('test: ', Date.now() - t); 
 
} 
 

 
function test1() { 
 
    var t = Date.now(); 
 
    var p = 0; 
 
    for (var i = 0; i < 100000000; i++) { 
 
    p += i % 2; 
 
    } 
 
    console.log(p) 
 
    console.log('test1 : ', Date.now() - t); 
 
} 
 

 
test(); 
 
test1();

は、クロムで上記のコードを実行してみましょうよりも、なぜのvar宣言。 let 'faultまたはmy faultですか?

50000000 
test: 1146 

50000000 
test1 : 148 
+0

Firefoxでは、私はその動作が表示されません。私は両方の機能について約100ミリ秒かかる。 – Pointy

+2

私はChrome開発者だけではこの質問に答えることはできないと思っていますが、Chromeのスコープ内部実装のこの特有の癖を理解することの有用性は疑問です(しかし、間違いかもしれません)。 – apsillers

+1

'let'は追加スコープの作成を強制します。それを作成するには時間がかかる可能性があります。 –

答えて

3

forループでletキーワードをES6にJavaScriptで悪名高いclosure in a loop問題解決するために設計されていることを言及する価値があるかもしれません:

var log = msg => div.innerHTML += msg + "<br>"; 
 

 
for (var i=0; i < 3; i++) { 
 
    Promise.resolve().then(() => log(i)); // 3, 3, 3 
 
} 
 
for (let i=0; i < 3; i++) { 
 
    Promise.resolve().then(() => log(i)); // 0, 1, 2 
 
}
<div id="div"></div>

ように@ loganfsmythはコメントの中で言及していますが、これはループの繰り返しごとに新しいクロージャを効果的に作成することで行います。

これは、この機能が新しくなっていることから、Chromeで見られるパフォーマンスの違いの一部を説明している可能性があります。つまり、あなたの特定の例ではFirefoxに違いはないように見えるので、ブラウザはこれを最適化することが可能です。