Javascript奇怪的return语句而不是循环数组

时间:2016-08-16 18:43:57

标签: javascript arrays performance

我遇到了这个javascript函数:

function functionName(a, b) {
    return a[0]===b[0]&&a[1]===b[1]&&a[2]===b[2]&&a[3]===b[3]&&
           a[4]===b[4]&&a[5]===b[5]&&a[6]===b[6]&&a[7]===b[7]&&
           a[8]===b[8]&&a[9]===b[9]&&a[10]===b[10]&&a[11]===b[11]&&
           a[12]===b[12]&&a[13]===b[13]&&a[14]===b[14]&&a[15]===b[15];
};

我想知道在哪种情况下代码会比这更好或更快(因为a和b显然是相同长度的数组):

function functionName(a, b) {
    for( var i = 0; i < a.length; i++ ) {
        if( a[i] !== b[i] ) {
            return false;
        }
    }
    return true;
};

或此版本(如果长度超过16):

function functionName(a, b) {
    for( var i = 0; i < 16; i++ ) {
        if( a[i] !== b[i] ) {
            return false;
        }
    }
    return true;
};

对此主题的任何参考表示感谢。感谢。

1 个答案:

答案 0 :(得分:1)

由于两个版本都进行了相同数量的数组元素比较,我希望内联版本更快,因为它没有任何循环管理。你可以试试这个:

var a = [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true];
var b = [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true];

function testA(a, b){
    return a[0]===b[0]&&a[1]===b[1]&&a[2]===b[2]&&a[3]===b[3]&&
           a[4]===b[4]&&a[5]===b[5]&&a[6]===b[6]&&a[7]===b[7]&&
           a[8]===b[8]&&a[9]===b[9]&&a[10]===b[10]&&a[11]===b[11]&&
           a[12]===b[12]&&a[13]===b[13]&&a[14]===b[14]&&a[15]===b[15];
}

function testB(a, b){
    for( var i = 0; i < a.length; i++ ) {
      if( a[i] !== b[i] ) { return false; }
    }
    return true;
}

var start;
var end;
var result;
var total;
var outerIttrations = 10;
var innerItterations = 1000 * 1000;

total = 0;
result = true;
for (var j=0; j<outerIttrations; j++){
    start = performance.now()
    for (var i=0; i< innerItterations; i++){ result = result && testA(a, b); }
    end = performance.now();
    total += (end - start);
}
console.log("Average Test A (inline) " + total / outerIttrations + " ("  + result + ")");

total = 0;
result = true;
for (var j=0; j<outerIttrations; j++){
    start = performance.now()
    for (var i=0; i< innerItterations; i++){ result = result && testB(a, b); }
    end = performance.now();
    total += (end - start);
}
console.log("Average Test B (loop) " + total / outerIttrations + " ("  + result + ")");