Как измерить время выполнения функции - PullRequest
946 голосов
/ 24 ноября 2008

Мне нужно получить время выполнения в миллисекундах.

Я изначально задавал этот вопрос еще в 2008 году. Принятый ответ тогда нужно было использовать new Date (). getTime () Однако мы все можем сейчас согласиться что использование стандартного performance.now () API более подходящее. Поэтому я меняю принятый ответ на этот.

Ответы [ 24 ]

0 голосов
/ 06 мая 2019

Лучше всего использовать модуль performance hooks. Несмотря на нестабильность, вы можете mark определенные области вашего кода и measure duration между отмеченными областями.

const { performance, PerformanceObserver } = require('perf_hooks');

const measures = []

const obs = new PerformanceObserver(list => measures.push(...list.getEntries()));
obs.observe({ entryTypes: ['measure'] });
const getEntriesByType = cb => cb(measures);

const doSomething = val => {
  performance.mark('beginning of the process');

  val *= 2;

  performance.mark('after multiplication');

  performance.measure('time taken', 'beginning of the process', 'after multiplication');

  getEntriesByType(entries => {
    entries.forEach(entry => console.log(entry));
  })

  return val;
}

doSomething(4);

Попробуйте здесь

0 голосов
/ 23 апреля 2019

Есть несколько способов достижения этой цели:

  1. с использованием console.time

    console.time('function'); //run the function in between these two lines for that you need to measure time taken //by the function. ("ex. function();") console.timeEnd('function');

  2. это самый эффективный способ: с использованием performance.now ()

ех. var v1 = performance.now(); //run the function here for which you have top measure the time var v2 = performance.now(); console.log("total time taken = "+(v2-v1)+"milliseconds";

  1. используйте + (добавить оператор) или getTime ()

    var h2 = +new Date(); //or var h2 = new Date().getTime(); for(i=0;i<500;i++) {//do something} var h3 = +new Date(); //or var h3 = new Date().getTime(); var timeTaken = h3-h2; console.log("time ====", timeTaken);

Вот что происходит, когда вы применяете унарный оператор плюс к экземпляру Date: Получить значение рассматриваемого экземпляра Date Преобразовать его в число

ПРИМЕЧАНИЕ: getTime () дает лучшую производительность, чем унарный оператор +.

0 голосов
/ 17 марта 2014

Как указано ранее, проверьте и используйте встроенный таймер. Но если вы хотите или должны написать свой собственный вот мои два цента:

//=-=|Source|=-=//
/**
 * JavaScript Timer Object
 *
 *      var now=timer['elapsed'](); 
 *      timer['stop']();
 *      timer['start']();
 *      timer['reset']();
 * 
 * @expose
 * @method timer
 * @return {number}
 */
timer=function(){
    var a=Date.now();
    b=0;
    return{
        /** @expose */
        elapsed:function(){return b=Date.now()-a},
        start:function(){return a=Date.now()},
        stop:function(){return Date.now()},
        reset:function(){return a=0}
    }
}();

//=-=|Google Advanced Optimized|=-=//
timer=function(){var a=Date.now();b=0;return{a:function(){return b=Date.now()-a},start:function(){return a=Date.now()},stop:function(){return Date.now()},reset:function(){return a=0}}}();

Компиляция прошла успешно!

  • Оригинальный размер: 219 байт в сжатом виде (405 байт без сжатия)
  • Скомпилированный размер: 109 байт в сжатом виде (187 байт без сжатия)
  • Экономия 50,23% по сравнению с сжатыми файлами (53,83% без GZIP
0 голосов
/ 03 февраля 2015

Принятый ответ неправильно !

Поскольку JavaScript является асинхронным, значения переменной end принятого ответа будут неправильными.

var start = new Date().getTime();

for (i = 0; i < 50000; ++i) {
// JavaScript is not waiting until the for is finished !!
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time); 

Выполнение for может быть очень быстрым, поэтому вы не можете видеть, что результат неверен. Вы можете проверить это с помощью кода, выполняющего некоторый запрос:

var start = new Date().getTime();

for (i = 0; i < 50000; ++i) {
  $.ajax({
    url: 'www.oneOfYourWebsites.com',
    success: function(){
       console.log("success");
    }
  });
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time); 

Таким образом, предупреждение будет выдано очень быстро, но в консоли вы увидите, что запросы ajax продолжаются.

Вот как вы должны это сделать: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...