5

私はいくつかの JavaScript パフォーマンスの最適化を試していて、興味深いものを見つけました。コードは次のとおりです。

function gObject() {

    this.obj = [];
    this.LIMIT = 100000;

    this.doLoopLocal = function () {
        var o = [];
        for (var i=0;i<this.LIMIT;i+=1) {
            o.push(i);
        }
        return o;
    };      

    this.doLoopObject = function () {
        this.obj = [];
        for (var i=0;i<this.LIMIT;i+=1) {
            this.obj.push(i);
        }
    };
};

var g = new gObject();

console.time('Using Local array');
g.doLoopLocal();
console.timeEnd('Using Local array');

console.time('Using Object array');
g.doLoopObject();
console.timeEnd('Using Object array');

実行すると、ローカル配列を使用すると、オブジェクト名前空間で定義された配列を使用するよりも遅いことがログに示されます。その差は大きく、8 ~ 10 倍です。(FF18.0.1)

Using Local array: 16ms
Using Object array: 2ms

スクリーンショット:ここに画像の説明を入力

関数内でローカルに定義されたオブジェクトを使用する方が高速であると常に想定していましたが、この実験は間違っていることを示しています。なぜこれが起こるのでしょうか?

更新:ローカルの Firefox コンソールでスクリプトを試してみたところ、数値は最初に期待したものでした: ローカル配列を使用すると、オブジェクト配列を使用した場合よりも優れています。したがって、本当の原因は、何らかの理由で数値を歪め、誤った結果を表示する Firebug です。心に留めておくべきこと。

4

1 に答える 1

1

いつもの魔法のように、魔法はそれが起こっていると信じている目の中にあります.
ところで、ここで何をテストしていますか? doLoopObject で this.obj を返さないことを忘れた場合、数回テストしただけで、結果が「ランダム」であることがわかります。さらに悪いことに、テストの順序を逆にすると、ブラウザーによって結果が変わる可能性があります。結果は、2 回のクリックの間の待機時間によって異なります。数秒待つと、常にほぼ同じになります。
JSPerf では、数値が増加している速度に注意してください。特に Firefox では、説明が非常に明白になります。周期的なスローダウンがあります。ガベージ コレクターは、このようなガベージ作成関数によってトリガーされます。それがトリガーされると、数値はよりゆっくりと増加します。オブジェクトまたはローカル変数の場合があります (問題ではありません)。ここで測定しているのはガベージ コレクターの時間であり、ローカル変数と比較したオブジェクト プロパティの push() 時間ではありません。これは、順序とテスト間の時間が変化する理由を説明しています。
2 つのテスト間の変化は大きすぎて何も結論付けられないことを付け加えておきます。

しかし、最も重要なことは、十分に待っていれば、どちらのテストも FF/Safari で同じように動作するということです...

これらすべてから導き出せる唯一の結論は、どちらの方法も同じように機能するということです。

しかし、単純なmyArray [lastIndex-1] = 0を使用して、それだけの「ヒープ」を割り当てる人はとにかく一度に割り当てるので、本当の結論は次のとおりです。このテストは何も示しません。

于 2013-02-10T17:23:27.337 に答える