如何准确地测量node.js中的响应时间?

时间:2018-12-22 15:05:34

标签: node.js express response

我有一个这样的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');
});

我想知道测量响应时间的最准确方法是什么?

5 个答案:

答案 0 :(得分:1)

问题是您没有进行任何计算来检查回复所需的时间。基本上,您将立即做出响应。如果您要计算的话,正确的做法就是这样。

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秒的函数。您可能想从数据库查询或做一些繁重的数学运算,而不是睡觉,等等。

答案 1 :(得分:1)

您可能还希望在节点(和浏览器)中使用Performance timing 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,关于性能测量,尤其是延迟/持续时间测量,完全在测量者的眼中。最准确的方法是在客户端代码中进行度量,并考虑网络延迟,中间处理,框架延迟等情况。

答案 2 :(得分:0)

该功能已由Express提供,并在the reference中进行了说明。

Express使用debug软件包。可以通过DEBUG环境变量全局启用调试:

process.env.DEBUG = '*';

或用于Express路由器:

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

在控制台中记录了每个操作的测量时间:

  

express:router查询:/ api + 2ms

     

express:router expressInit:/ api + 1ms

答案 3 :(得分:0)

我发现最好的解决方案(多亏this great tutorial)是使用//Card Struct //value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King function Card(suit, value, color){ this.suit = suit, this.value = value, this.color = color } //Check if two Cards are the same function cardEq(card1, card2){ if(card1.suit === card2.suit && card1.value === card2.value && card1.color === card2.color){ return true; } else {return false;} } //Check if two Decks/arrays of Cards are in the same order function deckEq(deck1, deck2){ let i = 0; let flag = false; while (i < 53){ let x = deck1[i]; let y = deck2[i]; if(cardEq(x, y) === true){ flag = true; i = i + 1; } else {flag = false; break;} } return flag; }

morgan

然后像下面这样在我的代码中使用它:

npm install morgan

答案 4 :(得分:0)

仅使用 node js 的最佳解决方案:

const { performance } = require("perf_hooks");

const t0 = performance.now();
// your code
const t1 = performance.now();

执行时间 = t1 - t0(以毫秒为单位)