Javascript 循环中的Array.pop()真的比Array.length快50倍吗=

Javascript 循环中的Array.pop()真的比Array.length快50倍吗=,javascript,arrays,performance,performance-testing,Javascript,Arrays,Performance,Performance Testing,我的问题是由Jsperf在这里提出的: 设置代码: Benchmark.prototype.setup = function() { var test_array = []; for (var j=0; j< 10000; j++){ test_array[j] = 'AAAAAAAAAA'; } }; JSPerf的结果显示,Array.pop()方法的完成速度比其他方法快了很多—在某些实现中快80倍以上 这是怎么回事?循环中的Array.pop()真的比其他

我的问题是由Jsperf在这里提出的:

设置代码:

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

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

};
JSPerf的结果显示,
Array.pop()
方法的完成速度比其他方法快了很多—在某些实现中快80倍以上


这是怎么回事?循环中的
Array.pop()
真的比其他测试快这么多吗?测试中是否有我看不到的缺陷

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

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

一个合适的测试用例,比如,在每次迭代中都会使用一个新的数组——这就是您想要测试的东西。随着更多(类似)工作的完成,解决方案之间的相对差异将变小,但您仍然可以注意到趋势。

哦,当然,即使是这些,你也永远不能确定…

你的测试有缺陷。它主要在空阵列上运行。在这种情况下,while条件比方法调用快。对于好奇我是如何发现这个的:@Aaditmshah被他自己的测试结果愚弄了…为什么数组是空的?如何?
// 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();