2016-09-21 21 views
6
Node.jsの5月v6.0.0では

forループの後でforループよりもずっと遅くなるのはなぜですか?

function testlet() { 
 
\t let a = 0; 
 
\t for (var i = 0; i < 100000000; i++) {} 
 
} 
 

 
function testlet2() { 
 
\t for (var i = 0; i < 100000000; i++) {} 
 
\t let a = 0; 
 
} 
 

 
console.time('let'); 
 
testlet(); 
 
console.timeEnd('let'); 
 

 
console.time('let2'); 
 
testlet2(); 
 
console.timeEnd('let2');

どのようにコードでletの位置は、このような大きなパフォーマンスの違いを引き起こす可能性がありますか?

+0

他のブラウザでも同様の違いはありません –

+0

これは 'const'でも起こりますが、' var'では両方の速度が同じです。 – 4castle

+2

奇妙なことに、私はあまり心配しないことをお勧めします。マイクロ最適化は動くターゲットです。明日の今日のことは、明日は簡単に遅くなる可能性があります。 –

答えて

7

教育的な推測をして、temporal dead zoneが原因だと言います。

あなたのマイクロベンチマークと思われるそのループは、Vyacheslav Egorovとしてeaten by the optimiser for breakfastと彼の話し合いではlikes to put itです。そして、それはそうではなくても、エンジンは何百万回も変数を増やします。両方の関数で同じ時間がかかるでしょう。

変数aが作成されたときとはまったく異なります。あなたの最初のスニペットでは、それは関数の最初にあり、前には何もありません。時間的な不感帯はなく、基本的に関数スコープ変数です。それをvarに変更しても違いはありません(試してみてください)。したがって、関数が呼び出されると、変数のスコープが作成され、値は0に初期化され、その後いくつかのコードが実行されます(または実行されません)。
一方、2番目のスニペットでは、一時的な不感帯があります。 let宣言の前のコードでは、aにアクセスすると例外がスローされます。したがって、関数が呼び出されるとスコープが作成され、aのスロットは予約されていますが、初期化されていません。この状態では、コードは実行されます(または実行されません)。その後は変数が初期化され、値0が割り当てられます。

letがコードの真中(またはその後ろ)にある場合、スコープはより複雑です。これにより、オプティマイザが別の方法で処理する可能性があります。同じ範囲にある変数iに影響を与えたり、特定の最適化を実行できない可能性があります。

関連する問題