【问题标题】:Predefining Array Length in Javascript在 Javascript 中预定义数组长度
【发布时间】:2014-02-01 08:48:17
【问题描述】:

将项目推入数组时,预定义 Javascript 数组的长度是否会提高性能?

例如,假设您正在这样做:

var item1 = "apple",
    item2 = "orange",
    item3 = "sports car"; // Because I said so, that's why.

var myArray = [];  // Empty array with initial length of 0

myArray.push(item1);
console.log(myArray.length) // 1

myArray.push(item2);
console.log(myArray.length) // 2

myArray.push(item3);
console.log(myArray.length) // 3

在上面的代码中,每次推送时都会重新计算 myArray 的长度。或者;

var item1 = "apple",
item2 = "orange",
item3 = "sports car";

var myArray = Array(3) // Assume we already know exactly how many items will be added
myArray[0] = item1;
console.log(myArray.length) // 3

myArray[1] = item2;
console.log(myArray.length) // 3

myArray[2] = item3;
console.log(myArray.length) // 3

我的问题是,当您将值显式分配给数组中的预先存在的插槽时,该数组的长度属性仍会重新评估。如果没有,是否回避该过程会产生更快的阵列填充?

不用说,这更像是一个理论练习,而不是一个实际的现实问题。

【问题讨论】:

  • 一些人在一个非常相关的问题上做基准测试:stackoverflow.com/questions/1295584/…
  • 数组文字更快,因为您不需要调用构造函数(或运行额外的函数),但我不确定您的特定问题。我怀疑它会产生真正的差异。
  • 我猜预先设置长度可能会加快以后的插入速度。
  • 我想长度属性没有被重新评估,它永远是 3 !我的意思是,如果您不添加 myArray[2] = item3;,长度仍将显示 3 而不是 2,因为第 3 个插槽将采用默认值
  • Jsperf 非常适合这种事情的真实世界测试。你的测试..jsperf.com/pre-allocated-arrays/6

标签: javascript arrays optimization


【解决方案1】:

根据this JSPerf,预定义长度快了很多。

应该注意new Array() 语法并不完全被认为是最佳实践。如果您绝对需要充分发挥性能,请考虑这一点。否则,请使用[],让您和所有接触您的代码的开发人员的生活更轻松。

【讨论】:

  • 这里并没有将苹果与苹果进行比较,因为您的第二个示例没有使用推送,这通常比仅分配索引要慢一些。看到所有变化(定义/未定义长度,按索引推送/分配)会很有趣。但结果很有趣。
  • @EvanTrimboli 我将添加一个非推送版本。
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 2014-10-08
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多