Array.pop()在循环中的确比Array.length =快50倍

时间:2015-01-26 02:51:26

标签: javascript arrays performance performance-testing

我的问题是由Jsperf在这里产生的:

http://jsperf.com/the-fastest-way-to-truncate-an-array/7

设置代码:

Benchmark.prototype.setup = function() {
  var test_array = [];

  for (var j=0; j< 10000; j++){
    test_array[j] = 'AAAAAAAAAA';
  }

};

测试:

// Array.slice() method
result = test_array.slice(0,100);

// Array.splice() method
test_array.splice(100);

// Modifying Array.length
test_array.length = 100;

// Array.pop() method
while (test_array.length > 100) test_array.pop();

JSPerf的结果表明,the Array.pop()方法比其他方法的完成速度更快 - 在某些实现上快了80倍。

这里发生了什么?循环中Array.pop()真的比其他测试快得多吗?测试中是否存在我没​​有看到的缺陷?

1 个答案:

答案 0 :(得分:5)

JsPerf每次设置多次运行每个测试。这意味着您只需对10000个元素数组进行一次测试,并且在后续(非常多次)运行中只剩下100个项目。

对于这种情况,while循环的条件是超快:单个(可能是高速缓存的)属性访问和比较。所有其他测试用例都调用一个方法或一个setter方法(在内部执行此测试,可能还有更多)。

正确的测试用例,如the one created by @zerkms,确实在每次迭代时都使用了一个新数组 - 这就是你要测试的东西。随着更多(相似)工作的完成,解决方案之间的相对差异会变小,但您仍然可以注意到趋势 哦,当然,即使是这些still fall prey to compiler optimisations,所以你永远不能确定......