【问题标题】:Should I pre-allocate an array or grow as I go我应该预先分配一个数组还是随我增长
【发布时间】:2018-08-07 18:54:55
【问题描述】:

在过去的几个月里,我一直在努力更好地理解 javascript。这绝对让我想获得计算机科学学位。无论如何,我很遗憾地遇到了两个与 JavaScript 相关但相互冲突的问题。

根据this article,不应该预先填充数组,而是在需要时增加它。

这听起来很棒,直到我遇到另一个 article on wikipedia 说执行上述操作会很慢。

我正在考虑从头开始制作一些游戏,并且作为代码素食主义者,我计划将性能放在我努力的最前面。 那么,拥有一个增长的数组还是一个预先分配的数组更好? 在 HTML5 游戏开发中,建议使用对象池之类的东西,我倾向于使用数组来创建它。

【问题讨论】:

  • 不要在 JS 中预填充数组,让解释器为你处理。维基百科文章正在讨论如何最好地处理动态数组的非常低级的权衡,所有这些 JS 都会为您处理
  • 还要注意,预填充和预分配是两个不同的东西。
  • @Hamms 你能详细说明一下吗?
  • 预分配意味着初始化一个数组,里面有你想要的空间:new Array(arrayLength)。预填充意味着初始化一个数组,然后用值填充它:new Array(arrayLength).fill(initialValue)

标签: javascript arrays performance v8


【解决方案1】:

粗略的指导方针:

预先分配的更好。如果您使用例如pushpop 开发一个,JS 引擎需要做很多额外的步骤。

即使使用超大数组也比经常更改大小要好得多。并且您应该尽可能对固定大小的数组进行操作。

Here您可以找到有关此的更多信息。

Aray 性能高度基于 JS 引擎实现:

因为 javascript 是一种规范而不是一种实现,不同的浏览器有不同版本的 Javascript 引擎。这些版本会定期更新以提高速度并采取不同的方法来优化它。

在优化时,通常会在某些功能的速度之间进行权衡,包括如何操作/创建数组。这意味着我上面提供的指南可能不是 100% 准确的,因为一个 JS 引擎可能具有其他 JS 引擎所缺乏的某些行为。这可能会导致对数组的操作/创建技术的速度不同。

【讨论】:

  • 男人!谢谢,我一直在寻找那篇文章(gamealchemist 的文章)。绝对是一本好书,现在我对 js 有了更好的理解,应该更有意义
  • 请注意,本文中的大多数声明都非常主观; JS 语言规范没有规定作者正​​在测试的任何操作的时间或内存复杂性,因此结果会因运行时环境而异。
  • @Hamms ? 我正要勾选这个答案,但你让我很怀疑。
  • 完全正确;结果会有很大的不同,因为文章所做的任何陈述都没有得到 JS 规范本身的支持;这篇文章针对 2013 年 Chrome 的 JS 实现状态提出了特定的声明
  • 反向迭代不应该被视为福音。有时您会想要向后遍历数组(例如,从数组中删除元素而不是使用 filter 创建新数组)。正如@Hamms 似乎在说的那样,性能对上下文非常敏感。任何声称“这种方式总是在所有情况下都是最好的方式”的文章都是在骗你。
猜你喜欢
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2011-01-22
  • 2016-02-10
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多