Как измерить время выполнения кода JavaScript с ответами


У меня есть фрагмент кода javascript, который я выполняю с помощью узла.переводчик с JS.

for(var i = 1; i < LIMIT; i++){
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
          if( err || !saved ) console.log("Error");
          else console.log("Saved");
    });
}

Я хочу знать, как измерить время, затраченное на эти операции вставки дБ. Я мог бы вычислить разницу значений даты после и до этого фрагмента кода, но это было бы неверно из-за асинхронного характера кода.

12 255

12 ответов:

используйте узел.js console.time() и console.timeEnd():

var i;
console.time("dbsave");

for(i = 1; i < LIMIT; i++){
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, end);
}

end = function(err, saved) {
    console.log(( err || !saved )?"Error":"Saved");
    if(--i === 1){console.timeEnd("dbsave");}
};

есть метод, который предназначен для этого. Проверьте

вызов console.time('label') будет записывать текущее время в миллисекундах, потом звонит console.timeEnd('label') отобразит продолжительность с этого момента.

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

console.time('test');
//some code
console.timeEnd('test'); //Prints something like that-> test: 11374.004ms

для получения дополнительной информации см. раздел документы разработчика Mozilla на console.time.

var start = +new Date();
var counter = 0;
for(var i = 1; i < LIMIT; i++){
    ++counter;
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
          if( err || !saved ) console.log("Error");
          else console.log("Saved");
          if (--counter === 0) 
          {
              var end = +new Date();
              console.log("all users saved in " + (end-start) + " milliseconds");
          }
    });
}

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

использовать

старый вопрос, но для простого API и легкого решения; вы можете использовать perfy который использует высокое разрешение в режиме реального времени (process.hrtime) внутренне.

var perfy = require('perfy');

function end(label) {
    return function (err, saved) {
        console.log(err ? 'Error' : 'Saved'); 
        console.log( perfy.end(label).time ); // <——— result: seconds.milliseconds
    };
}

for (var i = 1; i < LIMIT; i++) {
    var label = 'db-save-' + i;
    perfy.start(label); // <——— start and mark time
    db.users.save({ id: i, name: 'MongoUser [' + i + ']' }, end(label));
}

обратите внимание, что каждый раз perfy.end(label) называется, что экземпляр автоматически уничтожается.

раскрытие: написал этот модуль, вдохновленный ответ Д. Дерисо. Документы здесь.

удивительно, что никто еще не упомянул о новых встроенных библиотеках:

доступно в узле >= 8.5, и должно быть в современных браузерах

https://developer.mozilla.org/en-US/docs/Web/API/Performance

https://nodejs.org/docs/latest-v8.x/api/perf_hooks.html#

const { performance } = require('perf_hooks');
const delay = time => new Promise(res=>setTimeout(res,time))
async function doSomeLongRunningProcess(){
  await delay(5000);
}
performance.mark('A');
(async ()=>{
  await doSomeLongRunningProcess();
  performance.mark('B');
  performance.measure('A to B', 'A', 'B');
  const measure = performance.getEntriesByName('A to B')[0];
  console.log(measure.duration);
  // Prints the number of milliseconds between Mark 'A' and Mark 'B'
})();

https://repl.it/repls/OptimalOvercookedBusinesses

вы могли бы дать эталоном.js попробовать. Он поддерживает многие платформы среди них также узел.js.

вы также можете попробовать exectimer. Это дает вам обратную связь, как:

var t = require("exectimer");

var myFunction() {
   var tick = new t.tick("myFunction");
   tick.start();
   // do some processing and end this tick
   tick.stop();
}

// Display the results
console.log(t.timers.myFunction.duration()); // total duration of all ticks
console.log(t.timers.myFunction.min()); // minimal tick duration
console.log(t.timers.myFunction.max()); // maximal tick duration
console.log(t.timers.myFunction.mean()); // mean tick duration
console.log(t.timers.myFunction.median()); // median tick duration

[edit] теперь есть еще более простой способ использовать exectimer, потому что теперь он может обернуть код для измерения. Ваш код может быть завернут следующим образом:

var t = require('exectimer'),
Tick = t.Tick;

for(var i = 1; i < LIMIT; i++){
    Tick.wrap(function saveUsers(done) {
        db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
            if( err || !saved ) console.log("Error");
            else console.log("Saved");
            done();
        });
    });
}

// Display the results
console.log(t.timers.myFunction.duration()); // total duration of all ticks
console.log(t.timers.saveUsers.min()); // minimal tick duration
console.log(t.timers.saveUsers.max()); // maximal tick duration
console.log(t.timers.saveUsers.mean()); // mean tick duration
console.log(t.timers.saveUsers.median()); // median tick duration

У меня была такая же проблема при переходе с AWS на Azure

для express & aws вы уже можете использовать существующие time () и timeEnd ()

для Azure, используйте это: https://github.com/manoharreddyporeddy/my-nodejs-notes/blob/master/performance_timers_helper_nodejs_azure_aws.js

эти time () и timeEnd () используют существующую функцию hrtime (), которая дает высокое разрешение в реальном времени.

надеюсь, что это помогает.

Я бы рекомендовал пробовать NodeTime который, кажется, хорошо подходит для того, что вы пытаетесь сделать.

и еще один вариант-использовать экспресс-отладка:

express-debug-это инструмент разработки для express. Это простое промежуточное программное обеспечение, которое вводит полезный отладочный вывод в ваш html, не препятствуя этому.

Он удобно предлагает панель профилирования:

общее время обработки req. промежуточное программное обеспечение, параметры и тайминги маршрутов.

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