跳到主要内容

perf_hooks.PerformanceObserver

2024年12月26日
柏拉文
越努力,越幸运

一、认识


perf_hooks.PerformanceObserverNode.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);
  1. 我们通过 PerformanceObserver 创建了一个观察者,并将回调函数 observerCallback 传入,该函数会在每次观察到性能条目时被调用。

  2. observe 方法:通过 observe 方法,指定我们感兴趣的性能条目类型(例如 measure)。这意味着我们将监听所有 measure 事件。

  3. 自定义性能标记:通过 performance.mark() 创建了两个标记—— startend,分别表示操作的开始和结束。

  4. 创建性能测量:使用 performance.measure() 计算两个标记之间的时间差,并将其作为测量条目报告。

  5. 打印性能数据: 当回调函数接收到性能条目时,它会打印每个条目的名称和持续时间。

  6. 断开连接:在回调函数中,我们使用 observer.disconnect() 来停止观察,以避免继续收集无关的性能数据。

三、API


3.1 new PerformanceObserver(callback)

const { PerformanceObserver, performance } = require('perf_hooks');
const observer = new PerformanceObserver(callback);

callback:一个函数,接收两个参数:

  • list:包含性能条目的对象,通常包含性能事件(如 measuremark)。

  • 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();

3.4 performanceObserver.takeRecords()