我想监控node.js中事件循环的每次运行所需的时间。然而,我不确定衡量这一点的最佳方式。我能想到的最好的方法是:
var interval = 500;
var interval = setInterval(function() {
var last = Date.now();
setImmediate(function() {
var delta = Date.now() - last;
if (delta > blockDelta) {
report("node.eventloop_blocked", delta);
}
});
}, interval);
我基本上是通过观察setInterval
的延迟来推断事件循环的运行时间。我在blocked节点模块中看到了同样的方法,但感觉不准确和笨重。有没有更好的方法来获取这些信息?
更新:按照hapi.js的做法,将代码更改为使用setImmediate
。
发布于 2016-04-07 22:18:22
“有没有更好的方法来获取这些信息?”我没有比检查SetImmediate的时间延迟更好的方法来测试eventloop,但是您可以使用node的高精度计时器而不是Date.now()
来获得更高的精度
var interval = 500;
var interval = setInterval(function() {
var last = process.hrtime(); // replace Date.now()
setImmediate(function() {
var delta = process.hrtime(last); // with process.hrtime()
if (delta > blockDelta) {
report("node.eventloop_blocked", delta);
}
});
}, interval);
注意:增量将是元组数组秒,纳秒。
有关process.hrtime()的更多细节,请访问:https://nodejs.org/api/all.html#all_process_hrtime
“主要用途是测量间隔之间的性能。”
发布于 2019-08-07 05:30:04
看看这个插件https://github.com/tj/node-blocked,我现在正在用它,它似乎能做你想要的事情。
let blocked = require("blocked");
blocked(ms => {
console.log("EVENT LOOP Blocked", ms);
});
将打印出事件循环被阻塞的时间(毫秒)。
发布于 2016-06-10 08:51:06
代码
此代码将以纳秒为单位测量事件循环触发所用的时间。它测量当前进程和下一次滴答之间的时间。
var time = process.hrtime();
process.nextTick(function() {
var diff = process.hrtime(time);
console.log('benchmark took %d nanoseconds', diff[0] * 1e9 + diff[1]);
// benchmark took 1000000527 nanoseconds
});
编辑:新增说明,
Process.hrtime(时间)
返回当前高分辨率实时数组,单位为纳秒数组。时间是一个可选参数,它必须是前一个process.hrtime()调用的结果(因此,一个以秒为单位的实时时间,包含前一个时间的纳秒元组数组),以便与当前时间不同。这些时间相对于过去的任意时间,与一天中的时间无关,因此不受时钟漂移的影响。它的主要用途是测量间隔之间的性能。
Process.nextTick(回调,参数)
当前事件循环运行完成后,调用回调函数。
这不是setTimeout(fn,0)的简单别名,它的效率要高得多。它在事件循环的后续节拍中触发任何其他I/O事件(包括计时器)之前运行。
https://stackoverflow.com/questions/28563354
复制相似问题