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()真的比其他测试快得多吗?我没有看到测试中的缺陷吗?

最佳答案

JsPerf对每个设置多次运行每个测试。这意味着您只能对10000个元素的数组进行一次测试,而在随后的(很多)运行中,数组中仅剩下100个项目。

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

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

08-06 02:57
查看更多