循环中的 Array.pop() 真的比 Array.length = 快 50 倍吗?
Is Array.pop() in a loop really 50x faster than Array.length =
我的问题是由这里的 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,所以你永远无法确定......
我的问题是由这里的 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,所以你永远无法确定......