效率:数组内的对象或对象内的数组?

时间:2015-12-15 02:54:04

标签: javascript arrays object micro-optimization

给定相同数量的数组/对象层,每个索引指示相同的东西,嵌套数组和对象的最佳顺序是什么?

我制作了一个基于网格的游戏,我需要存储关于每个方块的几条信息。我知道没有绕过多层次的阵列/对象。我已经让它以单向工作,所以在我更改大量代码之前(我在每个代码中都有至少5个带有繁重切换语句的函数(选择我们的图层)重新开始工作,或许还有其他10个人,我还需要改变,以及初始化功能),我想知道这个变化是否真的符合最佳实践。

目前,我已经按照这样的方式进行了布局:Game.grid.map[x][y][layer][direction],所以带有常规2D数组的地图,每个元素都是一个对象,包含" V&#34的属性;," S"," M"和" G",每个包含一个数组。 (金属,硅,栅极和通孔)

我正在考虑切换到Game.grid.map[layer][x][y][direction]我必须改变一点结构(比如我var base = this.map[x][y];然后使用base[layer][dir]然后我可以轻松地进行此更改并使用变量baseM,baseG和baseS。改变它只是单调乏味。我想知道如果有一个带有5个大型数组的对象而不是一个有很多非常大的2D数组会更高效。小物件。

我读到某个地方,在纯数组中,它取决于索引在每个级别上的变化频率,外部级别变化更慢。通过这种方式,改变它是有道理的。我倾向于同时处理金属,同时处理所有金属,硅和盖茨一起处理(ish)。

搜索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毫秒。 (通过将函数粘贴到控制台并从未定义的时间戳中减去该时间戳来测量。)在使顶层成为对象并使底层成为一堆对象之间,它也是10ms。制作所有关卡对象需要9毫秒。这让我感到惊讶。但这也意味着Bergi是对的。这没关系。我担心存在的物体数量很多,但如果10,000个新物体的耗时不到10毫秒,我的400个物体网格就不会成为问题。

实际上,效率的唯一变化就是你需要多长时间来读/写每种方式标记的代码。对我而言,在这个问题上避免使用并行数组肯定更容易。 (我没有意识到这个问题将在微观优化上。)感谢所有回答的人。

2 个答案:

答案 0 :(得分:2)

读取多维数组的parallel arraysmajor order。理论上,您可以从缓存位置获得一些速度,这取决于您通常如何访问阵列。

在实践中,特别是在像JS这样的解释性语言中,它几乎不重要(首先要进行优化还有很多其他事情)。去找对你最有意义的东西,并坚持下去。

答案 1 :(得分:0)

你在谈论多少件物品?正如@Bergi's answer提到的那样,在你走这条路之前,还有一个 LOT 更多要优化。技术上,通过索引在迭代期间通过索引访问可以稍快一些感谢对象通过属性,即使这样,它依赖于JS引擎的实现,这在像阵列数组这样的紧张情况下可能会有很大变化。

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