javascript - 为什么 V8 中自定义数组反向实现的速度是 .reverse() 的两倍

标签 javascript performance v8

在 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/

相关文章:

javascript - `?` 在某些对象属性之前是什么意思?为什么我的 ts 文件不接受它?

java - 计算数字中不重复的数字

javascript - angularjs组件的执行顺序是怎样的?

javascript - 如何将 html 开/关翻转开关添加到 jquery?

javascript - 错误 : ENOENT: no such file or directory, 打开 './views/s.ejs' Nodejs Express

c++ - 在 C++ 中加速双绝对值

与具有几百万行的表上的 "<>"相比,SQL Server "="运算符非常慢

javascript - 为什么 node.js 运行时比 Google chrome 控制台慢

node.js - 随着时间的推移, Node 应用程序逐渐消耗内存

javascript - Node.js 堆栈跟踪不包含用户代码