JS性能:为什么不加载未初始化或删除的元素

时间:2014-07-21 06:35:42

标签: javascript v8

Performance Tips for JavaScript in V8说:

  

不要加载未初始化或已删除的元素。并给出以下示例。

// example1
a = new Array();
for (var b = 0; b < 10; b++) {
  a[0] |= b;  // Oh no!
}

// example2
a = new Array();
a[0] = 0;
for (var b = 0; b < 10; b++) {
  a[0] |= b;  // Much better! 2x faster.
}

现在我想知道为什么未初始化数组的第一个元素会导致巨大的性能差异。我认为在循环中第一次分配a[0]后,这两个示例应该执行相同的操作。因此它应该几乎与它们运行时间相同。

感谢所有答案。

2 个答案:

答案 0 :(得分:1)

第一个数组以字典或无类型对象数组(可以容纳undefined)开头,并且在转换为数组之前可能会保留一段字典,这很昂贵。

第二个数组可以从一开始就由整数数组支持,这是一个非常快速的结构。

请注意,这些优化可能会发生变化,因此当您阅读此答案时,引擎的行为方式可能会有所不同......

答案 1 :(得分:0)

我认为重点在于,在第二个示例中,a的0索引值不是undefined - 并且因为您已为该索引指定了值,所以现在在对其进行评估时正在评估已建立/已实现的指数+价值。

这可能是也可能不完全正确,但这就是要点。你也可以在jsperf.com上创建一个条目并测试这个理论