2016-08-16 3 views
-1

Я наткнулся на этом яваскрипте функции: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]; 
}; 

Интересно, в какой ситуации будет то, что код лучше или быстрее, чем это (так как и Ь, очевидно, массивы же длина):

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; 
}; 

Почитал бы любую ссылку на эту тему. Благодарю.

+2

(1) Просто Benchmark его. (2) Редко бывает неплохо повторить предположение об оптимизации двигателя. –

+0

хорошо, обе версии почти одинаковы. Единственная (сомнительная) оптимизация, которую вы могли бы сделать, - это изменить первый, который будет «for» (var i = 0, len = a.length; i vlaz

+0

@Vid Оптимизация 'length' уже давно дискредитирована как ненужная. Давайте перестанем распространять рассказы старых жен. –

ответ

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 + ")");

Смежные вопросы