JavaScript:缓存嵌套变量的速度更快吗?

时间:2013-06-29 04:50:11

标签: javascript performance

假设我有一个变量嵌套在一个巨大的对象中,我经常重复使用它:

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变量是自动缓存还是浏览器每次请求时都必须搜索更大的变量?

2 个答案:

答案 0 :(得分:8)

与所有重要性能问题一样,最好在jsperf.com这样的工具中测试您的具体情况,这样您就可以测量您关心的确切情况,并且您还应该在多个浏览器中运行测试以确保你所测量的是语言实现的一般特征,而不仅仅是一个浏览器的特性。

在回答您的问题时,如果您要多次访问它,通常会更快地缓存深层对象引用。

在具体示例中,我在此编码:http://jsperf.com/cache-deep-reference,缓存的引用在chrome中的速度提高了2倍以上,在IE10中的速度提高了4倍以上。

答案 1 :(得分: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