Как измерить время выполнения кода 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 ответов:
используйте узел.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' })();
вы могли бы дать эталоном.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. промежуточное программное обеспечение, параметры и тайминги маршрутов.
также. чтобы добавить к вышеприведенным ответам, вы можете проверить ответ чтобы активировать любой код профилирования только для среды разработки.