【问题标题】:How accuratly measure response time in node.js?如何准确测量 node.js 中的响应时间?
【发布时间】:2019-05-22 15:10:53
【问题描述】:

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

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

【问题讨论】:

  • 这取决于您所说的“响应时间”到底是什么意思。
  • 您的意思是您需要多长时间才能回复?
  • @MuhandJumah 是的,我的意思是回复的时间。
  • @estus 我的意思是从节点接收到http请求并将json响应发送给用户所花费的时间。

标签: node.js express response


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您可能还想在 Node(和浏览器)中使用 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,关于性能测量,尤其是延迟/持续时间测量,这一切都在测量者的眼中。最准确的方法是测量客户端代码并考虑网络延迟、中间处理、框架延迟等因素。

    【讨论】:

    • 你到底是什么意思?似乎您要问的问题更像是“如何测量我的特定代码中的时间?”而不是寻找准确性或更特别的东西。
    • 这可能对你有帮助:stackoverflow.com/a/64906447/3904109
    【解决方案3】:

    我找到的最佳解决方案(感谢this great tutorial)是使用morgan:

    npm install morgan
    

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

    const morgan = require('morgan');
    
    
    app.use(morgan('dev'));
    

    【讨论】:

      【解决方案4】:

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

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

      process.env.DEBUG = '*';
      

      或者对于 Express 路由器:

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

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

      express:路由器查询:/api +2ms

      express:路由器 expressInit : /api +1ms

      【讨论】:

      • 这一行应该出现在脚本中,就这么简单。
      • 好吧,我在代码中添加了process.env.DEBUG = 'express:router*';,但控制台上没有打印任何额外内容。
      • 尝试将其添加为第一行。您还可以将 DEBUG 作为环境变量从 shell 传递。
      • 现在我得到了express:router expressInit : /api +0ms 之类的东西。显然,计算不到毫秒是不够准确的。
      • 没有query吗?我假设完整的请求是query 加上expressInit。您没有在问题中定义“准确”,但我会说四舍五入的 0ms 是挑剔的。这条路线几乎不需要时间。
      【解决方案5】:

      问题是您没有进行任何计算来检查您需要多长时间才能做出响应。基本上你会立即回复。如果你有一些东西要计算,那么正确的做法是这样的。

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

      【讨论】:

      • ReferenceError: doWork 未定义
      • doWork 只是一个虚拟函数。您必须自己创建它才能完成任何需要完成的工作。这个函数里面有一个回调
      • 请提供完整的代码。你的 sn-p 也有语法错误。
      • 编辑了我的答案以包含 doWork 的外观示例
      • 请给出一个实际可行的完整解决方案。不知道如何把你的 sn-ps 放在一起。
      猜你喜欢
      • 2021-11-03
      • 1970-01-01
      • 2020-08-02
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2011-11-14
      • 1970-01-01
      相关资源
      最近更新 更多