JS性能:为什么不加载未初始化或删除的元素?
JS performace: why don't load uninitialized or deleted elements
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上创建一个条目并测试这个理论
相关文章:
- 从组件状态的数组中删除元素
- 从数组中删除元素的最佳方法是:javascript/jquery
- 正则表达式条件来删除元素
- 使用javascript删除元素时出现的问题
- 当会话存储阵列中存在大量元素时,如何从中删除元素
- 从角度数组中删除元素
- AngularJs localStorage在循环中删除元素
- 在使用jquery插入之前删除元素
- 如何删除元素列表中的类并添加到另一个元素 Jquery.
- 更新分组条形图(转换或删除元素组)
- 向下滚动后如何用同一类逐个删除元素
- 如何防止 jQuery 事件在删除元素时冒泡
- 从jQuery对象中删除元素
- 如何删除元素的结束标记,添加一些文本,然后重新添加标记
- 从画布中删除元素
- 如何解析html以删除元素并只返回其位置的标题
- 使用 V8 从密集数组中删除元素的最佳方法是什么
- 如何使用jquery删除元素
- 根据成员属性从数组中删除元素
- 从中删除元素'的父元素,并将其附加到其他元素