在 Chrome 中测试时,反转数组的简单实现比 Javascript 中的内置函数快两倍。 V8在做什么?这是测试:
var newArr = [];
var newArrDefault = [];
for(var i = 0; i < 10000000; i++){
newArr[i] = i;
newArrDefault[i] = i;
}
var startDefault = new Date();
newArrDefault.reverse();
console.log("Built in method took " + (new Date().getTime() - startDefault.getTime()));
var start = new Date();
for(var i = 0; i < newArr.length / 2; i++){
var tmp = newArr[i];
newArr[i] = newArr[newArr.length-i-1];
newArr[newArr.length-i-1] = tmp;
}
console.log("Custom method took " + (new Date().getTime() - start.getTime()));
版本 20.0.1132.47 Ubuntu 12.04 (144678) 上的结果:
Built in method took 149
Custom method took 71
最佳答案
为了好玩,我像这样实现了规范:
var upper, upperExists, lowerExists, lowerValue, upperValue;
for(var lower = 0, len = newArr.length >>> 0, middle = Math.floor(len / 2); lower != middle; ++lower) {
upper = len - lower - 1;
lowerValue = newArr[lower];
upperValue = newArr[upper];
lowerExists = newArr.hasOwnProperty(lower);
upperExists = newArr.hasOwnProperty(upper);
if (lowerExists && upperExists) {
newArr[lower] = upperValue;
newArr[upper] = lowerValue;
} else if (upperExists) {
newArr[lower] = upperValue;
delete newArr[upper];
} else if (lowerExists) {
newArr[upper] = lowerValue;
delete newArr[lower];
}
}
jsperf可以找到here 。
它包含一大堆代码来处理丢失的条目,这就是为什么它比 native 和您的代码慢得多(可能可以进行一些优化,但不会对性能产生足够的影响)。不过,您的代码和 native 实现之间的性能差异并不是非常确定。
在大多数情况下,数组是一个连续的值 block ,中间没有间隙,因此使用这种代码应该是安全的;只要你知道其中的区别:)
关于javascript - 为什么 V8 中自定义数组反向实现的速度是 .reverse() 的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13446654/