7

かなり頻繁に再利用する大規模なオブジェクト内に深くネストされた変数があるとします。

i = 10000000;
while (i) {
    i--;
    document.write( bigobject.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p );
}

ループ外の新しい変数にキャッシュする方が速いでしょうか?

v = bigobject.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p

そのキャッシュされた変数をループで使用しますか?

document.write ( v );

視覚にあまり関心がない人向け: JavaScript 変数は自動的にキャッシュされますか、それともブラウザーは要求されるたびにより大きな変数を検索する必要がありますか?

4

2 に答える 2

8

重要なすべてのパフォーマンスの問題と同様に、jsperf.com のようなツールで特定の状況をテストして、関心のある正確な状況を測定できるようにすることを常にお勧めします。再測定は、言語実装の一般的な特性であり、特定のブラウザーに固有のものではありません。

あなたの質問への回答として、複数回アクセスする場合は、通常、深いオブジェクト参照をキャッシュする方が高速です。

特定の例では、http: //jsperf.com/cache-deep-referenceでコーディングしました。キャッシュされた参照は、chrome で 2 倍以上、IE10 で 4 倍以上高速でした。

于 2013-06-29T04:52:23.507 に答える
0

これはすでに回答されていることは知っていますが、これについて独自のテストを作成し、SOの誰かが役立つと思うかもしれません:

ClassCreate('app').props.set('cipher', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z']);

perfTest({
    ns: 'noCache',
    fn: function() {
        for (var i = 0; i < 500; i++) {
            console.log(app.props.get('cipher'));
        }
    }
});

perfTest({
    ns: 'cached',
    fn: function() {
        var cipher = app.props.get('cipher');
        for (var i = 0; i < 500; i++) {
            console.log(cipher);
        }
    }
});

結果

キャッシュされた変数 x500: 812.261ms

同じ x500 ループ内のオブジェクトへの直接アクセス: 1050.416ms

于 2015-09-01T19:35:13.423 に答える