JavaScript性能优化:清空数组

12

我刚才看了一下:

http://jsperf.com/array-destroy/32

我不明白第一个:

arr.length = 0;

可能比以下要慢:

while (arr.length > 0) {
  arr.shift();
}

有人能够提供链接或解释一下为什么吗?


3
请查看 https://dev59.com/k3M_5IYBdhLWcg3wyWSt#1234337。 - Nicolae Olariu
3
谢谢!但链接没有解释为什么更快,还是我错过了什么? - Vadorequest
3
当设置length时涉及到很多内容:http://es5.github.io/#x15.4.5.1,与`.shift`: http://es5.github.io/#x15.4.4.9相比较。仍在努力查找每个算法在执行`.length = 0`时触发的部分。 - Felix Kling
1
嗯,还是不清楚。看起来.shift也会触发与分配给.length相同的代码。 - Felix Kling
可能是解释器中采用的垃圾回收机制和其他迭代条件检查导致了这种情况。哪种方法表现最佳取决于JavaScript引擎。在Firefox中,pop方法比shift方法快1.8%以上。 - David H. Bennett
2个回答

14
在测试设置中,创建了一个大的数组。一旦测试开始,该数组会被清空,并且测试会重复进行。然而,在第一次运行测试之后的每一次,该数组都已经为空。为了准确地执行此测试,您必须每次创建一个新的数组。 尝试这个: http://jsperf.com/array-destroy/67 我修改了测试以每次返回一个新数组。结果如预期。splice和length最快,因为它们立即修改数组的长度而不需要循环。详细结果和条形图请见上方图片。

3
啊,我知道这里出了问题。或者我错过了 JavaScript 数组的重要内容,谢谢!除非有幕后的魔法触发隐藏的东西,否则我不明白循环怎么可能比简单赋值更快。 - Vadorequest

2

使用pop()方法会移除数组中的最后一个元素。

而使用shift()方法,则会移除数组中的第一个元素,并重新索引其余所有元素。当数组越大,这个过程需要的时间就越长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接