【问题标题】:Measuring time on node.js http requests测量 node.js http 请求的时间
【发布时间】:2014-09-25 11:23:00
【问题描述】:

我想知道我们是否可以测量使用 node.js 完成 http 请求所需的时间。稍微修改一下文档中的一个例子(here),就可以轻松写下如下代码。

var http = require('http');
var stamp1 = new Date();
var stamp2, stamp3, stamp4;
var options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'
};

var req = http.request(options, function(res) {
  stamp3 = new Date();
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
  res.on('end', function () {
    stamp4 = new Date();
    console.log ("Stamp 3: " + stamp3);
    console.log ("Stamp 4: " + stamp4);
  });
});
req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

stamp2 = new Date();
console.log ("Stamp 1: " + stamp1);
console.log ("Stamp 2: " + stamp2);

现在让我来谈谈我的观点。在响应中,可以轻松测量响应所需的时间,因为在开始时设置了标记 3,在结束时设置了标记 4。因此,原则上对于相对大量的数据,这两个时间戳是不同的。

但是,我的问题是,标记 1 和 2 是否真正衡量了在准备和发送请求时发生的情况。换句话说, req.write(....) 是同步操作吗?基于 node.js 原则,我希望 req.write(...) 是一个异步操作,可以传递任意大的文档,然后在成功完成后,我们可以知道请求已完成的回调。

评论?

【问题讨论】:

  • 您可能想要创建一个实用函数来执行测量,并且您可以使用Date.now() 从第一个时间戳中减去第二个时间戳来获得实际的持续时间。另请注意,您可以使用 process.hrtime 以纳秒为单位进行测量。
  • 谢谢,我喜欢 process.hrtime 的建议,因为我不知道!作为减法,这正是我最终用于实际测量的观点。

标签: javascript node.js timing http-request


【解决方案1】:

为此已经存在两个函数:

  • console.time(id),启动计时器
  • console.timeEnd(id) 结束计时器,打印 id 后跟时间(毫秒)

所以在你的情况下:

var req = http.request(options, function(res) {
    console.time('Requete: '); //Begin to count the time
    stamp3 = new Date();
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('BODY: ' + chunk);
    });
    res.on('end', function () {
        stamp4 = new Date();
        console.log ("Stamp 3: " + stamp3);
        console.log ("Stamp 4: " + stamp4);
        console.timeEnd('Requete: '); //Will print "Requete: X" with X being the time in ms
    });
});

【讨论】:

  • 我认为您没有理解我的问题,我想知道谁投了赞成票。正如给出的那样,人们已经可以计算响应所花费的时间(res),因为时间戳 4 是在可用的回调上定义的。我的观点是我不能对请求(req)做同样的事情。换句话说,沿着 req.on('end', function () {....}); 写下一些东西。我试图描述的问题有意义吗?
【解决方案2】:

docs 没有提到回调,所以我假设 req.writeres.end 是同步的。

所以在你的情况下,如果你只是指你正在初始化的那个请求,我认为时间测量应该是准确的。不过,我不认为时差会很大(甚至可能在同一毫秒内)。

【讨论】:

  • 这就是为什么我使用短语“用于相对大量的数据”,以便测量可以延迟超过一毫秒。另一方面, res.on('end', function () {....});工作,stamp4 得到一个时间戳,我可以看到打印语句。另一方面,形式为 req.on('end', function () {....}); 的语句没有正确设置 stamp2(假设在事件处理函数中为请求的“结束”设置了 stamp2,并且与响应的“结束”的事件处理程序相反)。因此,请求和响应的处理方式似乎略有不同。
猜你喜欢
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多