效率:数组中的对象还是对象中的数组?

Efficiency: Objects inside arrays or arrays inside objects?

给定相同数量的 array/object 层,每个索引表示相同的事物,嵌套数组和对象的最佳顺序是什么?

我正在制作一个基于网格的游戏,我需要存储关于每个方块的几条信息。我知道无法绕过 arrays/objects 的多个级别。我已经让它以一种方式工作,所以在我改变大量代码之前(我至少有 5 个函数,每个函数中都有一个沉重的 switch 语句(选择我们正在使用的层),并且也许还有 10 个我还必须更改,连同初始化函数),我想知道这个更改是否真的符合最佳实践。

目前,我的布局是这样的:Game.grid.map[x][y][layer][direction],所以一个带有常规二维数组的地图,每个元素都是一个对象,包含 "V" 的属性,"S"、"M" 和 "G",每个都包含一个数组。 (金属、硅、栅极和通孔)

我正在考虑切换到 Game.grid.map[layer][x][y][direction] 我将不得不更改一些结构(例如我有 var base = this.map[x][y]; 然后使用 base[layer][dir] 但我可以轻松地制作此更改并使用变量 baseM、baseG 和 baseS。更改它只是乏味。我想知道拥有 1 个对象和 5 个大数组而不是拥有一个包含许多非常小对象的大型 2D 数组是否更有效.

我在某处读到,在纯数组中,它取决于索引在每个级别上更改的频率,而外部级别的更改速度更慢。由此,改变它是有意义的。我倾向于一次处理所有金属,一次处理所有通孔,同时处理硅和盖茨。

搜索 Google 将我带到这个 QA:Fastest way to read/store lots of multidimensional data? (Java) 但这只涉及纯数组,而不是对象和数组的混合

===编辑===

1) 是的,我错过了我发现的 QA 是 java 而不是 javaScript。

2) 我稍微修改了他们的测试。

var arr = [];
for (int x=0; x<100; x++){
    arr[x] = [];
    for (int y=0; y<100; y++){
        arr[x][y] = [];
        for (int z=0; z<100; z++){
             arr[x][y][z] = 1;
        }
    }
}

这花了大约 10 毫秒。 (通过将函数粘贴到控制台并从 'undefined' 时间戳中减去该时间戳来测量。)在使顶层成为一个对象和使底层成为一堆对象之间,它也是 10 毫秒。制作所有关卡对象需要 9 毫秒。这让我很吃惊。但这也意味着 Bergi 是对的。没关系。我担心现有对象的绝对数量,但如果 10,000 个新对象花费的时间少于 10 毫秒,我的 400 个对象网格应该永远不会成为问题。

因此,实际上唯一能发现的效率变化是您用 read/write 标记每种方式的代码需要多长时间。对我来说,在这一个上避免并行阵列肯定更容易。 (没想到这个问题是关于微优化的。)感谢所有回答的人。

阅读 parallel arrays and major order 多维数组。理论上,您可以从缓存局部性获得一些速度,这取决于您通常将如何访问数组。

在实践中,尤其是在像 JS 这样的解释型语言中,这无关紧要(还有很多其他事情需要先优化)。寻找对你最有意义的东西,并坚持下去。

你说的是多少个对象?正如 提到的,在您走这条路之前,还有 LOT 需要优化。从技术上讲,在迭代期间通过索引访问数组可能会稍微快一些,这要感谢通过属性访问对象,即使那样它也取决于 JS 引擎的实现,这在数组的数组等紧张情况下可能会有很大差异。

此外,根据对象的剪切数量,您可能会遇到内存限制。最后,在您最关心支持的浏览器中进行测试。这就是它可以归结为。避免一次循环太多项目(一旦超过 10k 左右,它可能会打嗝,超过一百万,你可能会遇到问题)。