Javascript 循环中的Array.pop()真的比Array.length快50倍吗=
我的问题是由Jsperf在这里提出的: 设置代码: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()真的比其他
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();