Как точно измерить время отклика в node.js? - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть приложение Express API, подобное этому.

var express = require('express');     
const app = express();    
app.get('/api', function(req, res) {
  res.json({
      text: 'my api!' 
  });
 )
});

app.listen(8090, function () {
    console.log('App listening on port 8090');
});

Мне интересно, как наиболее точно измерить время отклика?

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

Лучшее решение, которое я нашел (благодаря этому замечательному учебнику ), это использовать morgan:

npm install morgan

, а затем использовать его в своем коде так:

const morgan = require('morgan');


app.use(morgan('dev'));
0 голосов
/ 22 декабря 2018

Вы также можете использовать API синхронизации производительности в узле (и браузерах), чтобы использовать API, предназначенный для измерения производительности, а не полагаться на Date.Помимо более семантического API, вы можете иметь лучшее разрешение, и API будет иметь дело с такими проблемами, как «более поздний» вызов Date, возвращающий значение ниже, чем «более ранний» вызов, потому что кто-то испортил системное время.

Документы довольно понятны:

const { performance } = require('perf_hooks');
performance.mark('A');
    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'
});

OTOH, что касается измерения производительности и особенно измерений задержки / длительности, все это в глазах замерщика.Наиболее точный способ сделать это - измерить в клиентском коде и принять во внимание такие вещи, как задержка в сети, промежуточная обработка, задержки инфраструктуры и т. Д.

0 голосов
/ 22 декабря 2018

Эта функциональность уже предоставляется Express и объясняется в справочнике .

Express использует пакет debug.Отладка может быть включена через переменную среды DEBUG глобально:

process.env.DEBUG = '*';

или для маршрутизатора Express:

process.env.DEBUG = 'express:router*';

Измеренное время для каждой операции регистрируется в консоли:

экспресс: запрос маршрутизатора: / api + 2ms

экспресс: маршрутизатор expressInit: / api + 1ms

0 голосов
/ 22 декабря 2018

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

var express = require('express');     
const app = express();    
app.get('/api', function(req, res) {
  var start = new Date();

  doWork((err) => {
      var end = new Date() - start
      res.status = 200;
      res.end(`It took ${end}ms`);
  })
 )
});

function doWork(callback) {
    // Sleep for 10 seconds
    // This can be any logic, not only sleep (sleep in this case is use
    // to simulate a function that takes long to respond
    setTimeout(function(){callback(null)}, 10000);
}

app.listen(8090, function () {
    console.log('App listening on port 8090');
});

Вам нужно знать, что вы хотите сделать.Вы не можете просто измерить время запроса, потому что время запроса зависит от того, сколько времени вам потребуется для выполнения ваших вычислений, и поэтому, если у вас нет расчетов, то нет никакой разницы.Так что с doWork я смоделировал функцию, которая будет спать 10 секунд.Вместо того, чтобы спать, вы, возможно, захотите сделать запрос в БД или заняться какой-нибудь тяжелой математикой и т. Д ...

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