什么是性能最佳:包含键或包含数组的键的数组?

时间:2014-12-13 22:28:36

标签: javascript arrays json

我不确定json结构的最佳性能是什么。

我的结构目前看起来像这样:

{
    "walk": [
        {"x": 15,"y": 22,"on": ["onactive"]},
        {"x": 15,"y": 22,"on": ["onactive","agreeConditions"]}
    ]
}

这将基本上重复每个数组对象中的键。这将占用空间。

在javascript中你可以像这样循环:

for(var i = 0; i< walk.length; i++){
    console.log(walk[i].x);
    console.log(walk[i].y);
    console.log(walk[i].on);
}

我打算将其重组为:

{
    "walk": {
        "x": [15,15],
        "y": [22,22],
        "on": [
            ["onactive"],
            ["onactive","agreeConditions"]
        ]
    }
}

这只是一个包含所有键的对象,每个键包含一个数组。绝对占用更少的空间!

在javascript中你可以像这样循环:

for(var i = 0; i< walk.x.length; i++){
    console.log(walk.x[i]);
    console.log(walk.y[i]);
    console.log(walk.on[i]);
}

差异基本上是一个包含键和包含数组的键的数组。

那么基于良好的json结构的性能是什么?

阵列(

键:值,键:值

或者

对象(

键:阵列(值,值)

2 个答案:

答案 0 :(得分:1)

如果您想知道哪一个更快,您可以运行自己的基准测试。不过,两者之间几乎没有差别。

我倾向于选择第一个结构,因为它更容易理解,并且它允许您在需要时将对象作为参数传递。例如,我可以写一个函数:

function shiftWalkPoint(walkPoint, n) {
    walkPoint.x += n;
    walkPoint.y += n;
}

for (var i = 0; i < walk.length; i++){
    shiftWalkPoint(walk[i], 5);
}

然而,使用您的第二种格式,您无法做到这一点。您必须将整个walk对象以及索引传递给任何想要使用它的函数,这更加尴尬。如果您的数据和x.length != y.length发生了不良后果,也可能会遇到问题。

答案 1 :(得分:1)

您可以从JSON格式看到,文本格式中唯一的大小差异是对象数组中的重复属性名称。您还可以看到,在对象数组中更容易看到哪些值属于一起。

查看访问结构的方式,没有性能差异。访问您使用的walk[i].x对象数组,相当于walk[i][x]。访问包含使用walk.x[i]的数组的对象,这相当于walk[x][i]。唯一的区别是访问顺序,这不会影响性能。

查看内存使用情况,差异非常小。像[15,15]这样的数组在内存中表示为一个对象,其中项是具有数字键的属性,与{ "length": 2, "0": 15, "1": 15 }基本相同。这使得对象和数组在内存使用方面几乎相同。

总结:

  • 包含数组的对象在文本形式(JSON)中稍微紧凑。
  • 包含对象的数组更容易阅读。
  • 访问它们没有性能差异。
  • 他们会占用相同数量的内存。