直接用 performance.mark() 打点、performance.measure() 计算、performance.getEntriesByName() 提取结果即可获取高精度自定义测量数据;支持标记起止、创建测量、提取 duration,并可配合 PerformanceObserver 自动上报。

直接用 performance.mark() 打点、performance.measure() 计算、再用 performance.getEntriesByName() 提取结果,就能拿到自定义测量数据。整个过程不依赖外部库,精度高、语义清晰,适合监控函数执行、组件渲染、数据处理等关键路径。
打标记:明确起止位置
在要测量的代码段前后分别调用 performance.mark(),传入有意义的字符串名称:
- 起始标记如
performance.mark('render-start') - 结束标记如
performance.mark('render-end') - 标记名需唯一且可读,避免空格或特殊字符,推荐用短横线分隔
- 同一名称重复打点会覆盖前一次(除非主动清理),如需多次测量建议加时间戳或序号
创建测量:关联两个标记
用 performance.measure() 指定测量名称和起止标记名,生成一条 measure 类型的性能条目:
- 例如:
performance.measure('render-duration', 'render-start', 'render-end') - 第三个参数可省略,默认使用最近一次同名标记作为终点
- 若起止标记未找到,该测量不会生成,也不会报错,需自行检查标记是否已打
- 测量名称可与标记名不同,便于分类统计(如多个渲染阶段共用一组标记但分不同 measure)
提取结果:获取耗时数值
调用 performance.getEntriesByName() 拿到匹配的性能条目数组,从中读取 duration 字段:
const entries = performance.getEntriesByName('render-duration');- 返回数组按时间顺序排列,通常取
entries[0].duration即为毫秒级耗时(浮点数,精度可达微秒) - 若需清理历史记录,可用
performance.clearMarks()或performance.clearMeasures() - 建议在测量后尽快读取,避免被浏览器内部缓冲区限制或自动清理影响结果
配合 PerformanceObserver 实现自动上报
对频繁或关键的自定义测量,可用 PerformanceObserver 监听 measure 类型条目,避免轮询:
- 注册观察者:
new PerformanceObserver(cb).observe({ entryTypes: ['measure'] }) - 回调中过滤目标测量名,提取
entry.duration并发送至监控服务 - 这种方式异步、非阻塞,更适合生产环境长期采集
- 注意避免监听过多类型导致内存开销,可按需启用
paint或navigation等其他类型

















