Как сравнить скорость двух функций Javascript? - PullRequest
3 голосов
/ 17 февраля 2012

У меня есть Javascript, который читает в каком-то XML.Существует старая функция, которая использовалась для создания объекта JSON из этих данных, и я написал новую функцию, которая, я надеюсь, позволит быстрее создать этот объект JSON.Какой самый простой и лучший способ определить, какая функция выполняется быстрее?Это приличный объем данных, поэтому важно знать это.Спасибо.

Ответы [ 6 ]

12 голосов
/ 17 февраля 2012

Вы можете использовать console.time("ID"); и console.timeEnd("ID"); (информация здесь ) и посмотреть результаты в инструментах разработчика Chrome или Firebug, например:

console.time("oldFunc");
//oldfunc();
console.timeEnd("oldFunc");

console.time("newfunc");
//newfunc();
console.timeEnd("newfunc");

Кроме того, выможет использовать jsperf

2 голосов
/ 17 февраля 2012
(new Date).getTime();

Так вы получаете текущее время в миллисекундах. Сделайте это до и после выполнения кода, вычтите, и у вас будет время выполнения в миллисекундах.

Пример:

var start=(new Date).getTime();
//call your code
alert('Code took '+((new Date).getTime()-start)+'ms');

Если позволяет ваша организация кода, вы можете сделать вызов в цикле for, повторяя n (скажем, 1000) раз и деля время на n в конце.

Таким образом, вы получаете среднюю скорость, что особенно полезно, если ваши функции сильно различаются (например, сетевые вызовы).

1 голос
/ 08 июня 2012

Некоторая информация об этом и пример кода здесь

http://www.einternals.com/blog/web-development/javascript-find-script-execution-time-2

var startDate = new Date(); 

// execute your tasks here

var endDate = new Date();

var timeTaken = endDate.getTime() - startDate.getTime();

alert('Time take to execute the script is '+timeTaken+' milliseconds');
1 голос
/ 17 февраля 2012

Мне нравится Способ Джона Резига тестирования производительности функции:

function runTest(name, test, next){
  var runs = [], r = 0;
  setTimeout(function(){
    var start = Date.now(), diff = 0;

    for ( var n = 0; diff < 1000; n++ ) {
      test();
      diff = Date.now() - start;
    }

    runs.push( n );

    if ( r++ < 4 )
      setTimeout( arguments.callee, 0 );
    else {
      done(name, runs);
      if ( next )
        setTimeout( next, 0 );
    }
  }, 0);
}
0 голосов
/ 17 февраля 2012
 var d1 = new Date();     
 function1();
 var d2 = new Date();
 console.log("Function 1 : ", d2.getTime() - d1.getTime());

 function2();
 var d3 = new Date();
 console.log("Function 2 : ", d3.getTime() - d2.getTime());
0 голосов
/ 17 февраля 2012

Это в браузере или на стороне сервера?

Если это серверная часть, я бы рекомендовал использовать инструмент выбора сценариев оболочки для тестирования (у linux time, у windows ... все, что есть у Windows).

Если это в браузере, то вы всегда можете обернуть определенное количество итераций (обычно достаточно 10 000) в:

var start = new Date.getTime();

var runs = 10000;

while (runs) {
    // do stuff here

    runs--;
}

console.log('Finished in ' + (new Date.getTime() - start) + ' ms.');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...