私のプロジェクトでJavaScriptコードのリファクタリングをしているうちに、ループの一部が大幅に遅くなることがわかりました。私が見つけた根本的な原因を検索すると、が遅くなり、let
の文内にループとクロージャの作成が発生します。 for
ループの外にlet
と閉鎖を動かす私の驚きに は助けにはならなかった、とさえ減速がlet
によって引き起こされるので、ループ変数のためのvar
代わりのlet
を使用しても解決しないfor
ループの後を置きました。Javascript var vs v8とSpiderMonkeyでの最適化/減速の問題
"use strict"
console.log("=========================");
(function(){
var itr = 0;
function f(){++itr;}
console.time('without_let');
for(var i = 0; i < 50000000; ++i){
f();
}
var totals = 0;
console.timeEnd('without_let'); //chrome: 122ms, FF:102ms
})();
(function(){
var itr = 0;
function f(){++itr;}
console.time('let_below');
for(var i = 0; i < 50000000; ++i){
f();
}
let totals = 0; // <--- notice let instead of var
console.timeEnd('let_below'); //chrome: 411ms, FF:99ms
})();
(function(){
let itr = 0;
function f(){++itr;}
console.time('let_above_and_in_loop');
for(let i = 0; i < 50000000; ++i){
f();
}
var totals = 0;
console.timeEnd('let_above_and_in_loop'); //chrome: 153ms, FF:899ms
})();
(function(){
var itr = 0;
function f(){++itr;}
console.time('let_in_loop');
for(let i = 0; i < 50000000; ++i){
f();
}
var totals = 0;
\t \t console.timeEnd('let_in_loop'); //chrome: 137ms, FF:102ms
})();
(もJS Fiddle注:JSフィドルを使用すると、少し異なる結果を示したが、同様の減速はまだ同じ場所に存在している私は、このコードスニペットを得てきた余分な詳細を除去することにより )Chromeでこれを実行する
以下を生成し
without_let: 122ms
let_below: 411ms <----------- Slowdown for v8
let_above_and_in_loop: 153ms
let_in_loop: 137ms
何人かのグーグルがthe articleに私をもたらして、let
がChrome 56/V8 5.6より前の最適化解除を引き起こしたと述べました!私のクロムは57.0.2987.133(64ビット)とv8 ver 5.7.492.71です。 これをFirefox 52.0.2(32ビット)で実行しようとすると、さらに驚きました。
without_let: 101.9ms
let_below: 99ms
let_above_and_in_loop: 899ms <----- Slowdown for SpiderMonkey
let_in_loop: 102ms
:ここでは、let
で作成した変数は、クロージャ内で使用されている別の場所、の減速を持っています
2つの主要なブラウザ(主要なJavaScriptエンジン)がまだスニペットのそれらの(異なる)部分を最適化できないのはなぜですか?
(以外はを使用していますが、バベルを使ってvarに変換することはできません)クロムを有効にした後(https://omahaproxy.appspot.com/にaconding)V8バージョン5.8.283.37をcorrespondng 58.0.3029.96版Chromeの場合 、:私は
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
UPD経由してV8にも、直接Chromeにオプションを渡すか、することができるよと仮定://フラグ/#有効-V8-未来をjmrkは、以下第三のケースのための減速がまだある(今の2倍の代わりに8回)
without_let: 157.000ms
let_below: 155.000ms
let_above_and_in_loop: 304.000ms
let_in_loop: 201.000ms
のFirefox 53.0(32ビット)
を示唆されるように
彼らは*できないのではなく、まだ実装する時間が見つけられていないということではありません。バグレポートを提出して、優先順位を付けることができます。 – Bergi
v8のレポートはこちらhttps://bugs.chromium.org/p/v8/issues/detail?id=6188 、FFはこちらhttps://support.mozilla.org/en-US/questions/1158956 –
こちらもBugzillaのアイテムです。https://bugzilla.mozilla.org/show_bug.cgi?id=1362930 –