【发布时间】:2014-02-25 04:33:26
【问题描述】:
据我所知,存储 2D 数据有两种主要方式。一、二维数组:
var array = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// access element at (1, 1)
array[1][1];
另一个,一个带有存储width的平面数组:
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var width = 3;
// access element at (1, 1)
array[1 * width + 1];
互联网上都在说“多维”数组很糟糕,与平面数组和存储宽度相比,性能非常差。 (此外,类型化数组可用于进一步加速第二个变体)。但是,我真的不喜欢使用平面数组访问点所必须使用的语法,并且我认为您应该尽可能接近您的意思。此外,每一帧都有很多(我认为)不必要的数学运算。
我需要快速处理大型 2D 数组(你猜对了,游戏),我想知道展平我的数组是否值得可能的性能提升。那么,是吗?
【问题讨论】:
-
对其进行基准测试并找出答案。或者,更好的是,不要。如果您正确地封装了数组,那么在游戏结束后,从一种存储方法转换到另一种存储方法几乎不需要花费您任何成本。然后,您实际上将能够生成有用的基准而不是合成基准。
-
@meagar:因为在这种情况下,第二个版本将涉及从一种坐标类型到另一种坐标类型的大量杂耍(而且写起来很痛苦),这会抵消好处吗?这有点难以衡量。
-
这两个版本都不应涉及除函数调用之外的任何内容,例如
getData(x, y)和setData(x, y, value)。 -
为什么要从那里开始优化?我会先从基本重构开始,然后是算法,然后是记忆化,最后,只有当一切都失败时,我才会考虑更改逻辑数据结构以提高性能。
-
请注意,您可以将宽度存储为数组的属性:
array.width = 3;。
标签: javascript arrays performance multidimensional-array