2

観察を行いました-存在しない配列要素にアピールすると、パフォーマンスが大幅に低下します。長いループで目に見えます。なぜそれが起こるのですか?

例:

var filledArray = []; //This array will filled
var emptyArray = [];  //This array leave empty

//fill one array
for(var i = 0; i < 1e6; i++) {
    filledArray[i] = true;
}

//Just iterate the array and call its elements
//In filled array all elements exists, in empty array non-exists
function callItems(arr) {
    for(var i = 0; i < 1e6; i++) {
        arr[i];
    }
}

//measurement function
function bench(f, d) {
    var start = new Date;
    f(d);
    alert(new Date - start, ' ms');
}

////Result for filled array
//Firefox 24.0:             20 ms
//Chrome 30.0:              3  ms
bench(callItems, filledArray);

////Result for empty array
//Firefox 24.0:             340 ms
//Chrome 30.0:              70  ms
bench(callItems, emptyArray);

編集:
Firefox でコードを実行している場合は、Firefox が Firebug に影響を与えることに注意してください – 有効または無効にします。いろいろ試した結果、わかりました。
それが有効になっている場合 - 結果は同じです。ただし、Firefox の起動後に Firebug が有効になっていない場合、時間は 2 ミリ秒 (Opera や Chrome よりも高速) であり、空の配列と塗りつぶされた配列の差はなくなります。
結果スワップ呼び出し関数bench()にも影響します – 最初は空で、次に塗りつぶされた配列で(Firebugが有効なFirefoxのみ、Firebugがなく、他のブラウザでは結果は変わりません)。

なぜ Firebug に影響するのでしょうか? – 追加の質問。

4

1 に答える 1