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

JS performace: why don't load uninitialized or deleted elements

本文关键字:删除 元素 初始化 性能 为什么不 加载 JS      更新时间:2023-09-26

V8中JavaScript的性能提示:

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

// 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]后,这两个示例应该执行相同的操作。所以它应该和它们运行的时间差不多。

谢谢大家的回答。

第一个数组以字典或无类型对象数组(可以保存undefined)开始,并且可能在转换为数组之前保持一段时间为字典,这是昂贵的。

第二个数组可以从开始由一个非常快的整数数组来支持。

请注意,这些优化可能会发生变化,所以当你读到这个答案时,引擎的行为方式可能不一样…

我认为关键在于,在第二个例子中,a的0索引值不是undefined -并且由于您已经为该索引分配了一个值,现在当它被评估时,它是针对已建立/实现的索引+值进行评估。

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