perf_hooks.PerformanceObserver
一、认识
perf_hooks.PerformanceObserver
是 Node.js
中的一个类,它提供了一个机制,用于异步观察和获取性能相关的数据。这些数据包括但不限于事件循环延迟、资源使用情况、定时器的执行时间等,主要用于高性能应用的监控和性能分析。
二、语法
const { PerformanceObserver, performance } = require('perf_hooks');
// 定义回调函数,处理性能数据
const observerCallback = (list, observer) => {
// 获取所有记录的性能条目
const entries = list.getEntries();
// 打印每个条目
entries.forEach(entry => {
console.log(`${entry.name}: ${entry.duration}ms`);
});
// 停止观察
observer.disconnect();
};
// 创建 PerformanceObserver 实例
const observer = new PerformanceObserver(observerCallback);
// 开始观察 'measure' 类型的条目
observer.observe({ entryTypes: ['measure'] });
// 创建自定义性能标记
performance.mark('start');
// 模拟一些工作(比如执行函数)
setTimeout(() => {
performance.mark('end');
// 创建测量(从 'start' 到 'end' 的时间)
performance.measure('MyOperation', 'start', 'end');
}, 1000);
-
我们通过
PerformanceObserver
创建了一个观察者,并将回调函数observerCallback
传入,该函数会在每次观察到性能条目时被调用。 -
observe
方法:通过observe
方法,指定我们感兴趣的性能条目类型(例如measure
)。这意味着我们将监听所有measure
事件。 -
自定义性能标记:通过
performance.mark()
创建了两个标记——start
和end
,分别表示操作的开始和结束。 -
创建性能测量:使用
performance.measure()
计算两个标记之间的时间差,并将其作为测量条目报告。 -
打印性能数据: 当回调函数接收到性能条目时,它会打印每个条目的名称和持续时间。
-
断开连接:在回调函数中,我们使用
observer.disconnect()
来停止观察,以避免继续收集无关的性能数据。
三、API
3.1 new PerformanceObserver(callback)
const { PerformanceObserver, performance } = require('perf_hooks');
const observer = new PerformanceObserver(callback);
callback
:一个函数,接收两个参数:
-
list
:包含性能条目的对象,通常包含性能事件(如measure
、mark
)。 -
observer
:观察者实例本身,可以用来控制观察者的行为
3.2 performanceObserver.observe(options)
observer.observe(options);
options
(必需):用于指定观察的性能条目类型及其他配置选项。options
是一个对象,可以包含以下字段:
-
entryTypes
:一个字符串数组,用于指定希望观察的性能条目类型(如measure
,mark
,gc
,eventloop
等)。 -
buffered
(可选):指定是否使用缓冲模式(默认是false
)。如果为true
,它会立即将已记录的性能条目传递给观察者。
性能条目类型: PerformanceObserver
支持多种类型的性能条目。你可以在 observe
方法的 entryTypes
配置中指定你希望监听的类型:
-
mark
:用于标记代码段的起始和结束点,便于后续测量。 -
measure
:用于测量标记之间的时间差。你可以使用performance.measure()
创建它。 -
gc
(垃圾回收):记录垃圾回收事件(如果启用了--trace-gc
标志)。 -
eventloop
:监控Node.js
事件循环的延迟和其他相关数据(通过perf_hooks.monitorEventLoopDelay
)。 -
resource
:可以通过PerformanceResourceTiming
获取更多关于资源加载的信息。
3.3 performanceObserver.disconnect()
performanceObserver.disconnect()
停止性能观察。此方法用于停止对事件的监听,通常在不再需要监控时调用。
observer.disconnect();