为什么(对象中的许多对象)比(一个对象中的许多元素)更快?

时间:2015-05-21 14:58:34

标签: javascript performance object

我有~16,000个项目(一个项目是数组,有6个值)。所有项目都有5"属性",他们的数字。我需要存储它们,当我知道属性时,尽快返回项目。我尝试了两种方法:

  1. 对象中的对象。如果a = attribute1b = attribute2 ...到e,那么我可以通过data1[a][b][c][d][e]获取用户正在查找的项目。以这种格式存储的完整数据:http://jpst.it/z12-
  2. 一个对象,但它有16k数组,对象的属性是给定项的属性。然后是myItem = data2[""+a+b+c+d+e]http://jpst.it/z13p
  3. 我运行了一些测试,看看哪种方法更快:

    var test,
        a = 30175,
        b = 5,
        c = 1,
        d = 1,
        e = 60,
        abcde = 301755360;
    console.time("test1");
    for (var i = 0; i < 9999999; i++)
        test = data1[a][b][c][d][e];
    console.timeEnd("test1");
    console.time("test2");
    for (var i = 0; i < 9999999; i++)
        test = data2[abcde];
    console.timeEnd("test2");
    

    我的电脑上的结果:

                test1       test2
    Firefox:    1482.00ms   1341.00ms
    Chrome:     665.00ms    424.00ms
    Explorer:   12555.17ms  4945,50ms
    

    第二种方法总是更快。但为什么?我跑了另一个测试,知道JS必须检查给定对象的密钥是否等于所需密钥的次数:

    var x = 0;
    function fn(obj, myKey) {
        for (var key in obj) {
            x++;
            if (key == myKey)
                return obj[key];
        }
    }
    

    方法1:fn(fn(fn(fn(fn(data1, a), b), c), d), e); =&gt; x是352 方法2:fn(data2, abcde); =&gt; x是3154.
    但是,方法2不慢10倍,甚至更快。

1 个答案:

答案 0 :(得分:0)

这可能会让您了解正在发生的事情。第二个吸气剂被称为9次,第一个吸气剂被称为45次。每次它首先必须访问30186,然后是6,然后... 5调用每次迭代来获取值。

var x = 0;
var y = 0;

var data1 = {"30186":{"6":{"1":{"1":{"0":[4,1430745862,"3 - 5 ref","4 ref","4 ref",1]}}}}};
var data2 = {"3018663":[4,1430745862,"3 - 5 ref","4 ref","4 ref",1]};

Object.prototype.get = function(i) { x++; console.log(i); return this[i]; }
Object.prototype.get2 = function(i) { y++; return this[i]; }

for (var i = 0; i < 9; i++)
    test = data1.get(30186).get(6).get(1).get(1).get(0);

for (var i = 0; i < 9; i++)
    test = data2.get2(3018663);

console.log(x, y);