关键在于捕获主线程阻塞、内存占用与用户响应延迟:用Performance.now()/mark/measure测函数耗时;Long Task API监听≥50ms长任务;Memory面板+Heap Snapshot查泄漏;PerformanceObserver捕获FID/LCP并关联用户行为。

监控 JavaScript 运行时性能,关键在于捕获脚本对主线程、内存和用户响应的实际影响。不能只看“快不快”,而要看“卡不卡”“占不占”“稳不稳”。
测量函数级执行耗时
用 Performance API 获取微秒级精度的耗时数据,适合定位具体函数瓶颈:
- 在关键逻辑前后调用
performance.now()计算差值,简单直接 - 对复杂流程使用
performance.mark()打点 +performance.measure()生成可归类的耗时条目 - 通过
performance.getEntriesByType('measure')批量提取,便于上报或聚合分析
识别主线程阻塞任务
单个脚本运行超 50ms 就可能让用户感知卡顿。需主动发现长任务:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 开发阶段:在 Chrome DevTools 的 Performance 面板录制操作,查看 “Main” 轨道中持续 >50ms 的色块
- 生产环境:用 Long Task API 监听并上报,例如监听
entryTypes: ['longtask'],记录entry.duration和触发上下文 - 注意:不是所有长任务都来自你写的 JS——第三方 SDK、框架初始化、甚至 polyfill 都可能成为元凶
跟踪内存分配与回收行为
内存问题常表现为偶发卡顿、页面变慢,需结合工具定位:
立即学习“Java免费学习笔记(深入)”;
- 开发时打开 Chrome DevTools 的 Memory 面板,用 Heap Snapshot 对比不同状态下的对象引用关系
- 启用 Allocation instrumentation on timeline,观察运行中哪些函数频繁分配新对象(尤其是循环内)
- 重点检查闭包是否意外持有 DOM 节点、定时器未清除、事件监听器未解绑等典型泄漏模式
采集真实用户交互反馈
实验室数据再准,也不如用户手指划过屏幕那一刻的真实表现:
- 用 PerformanceObserver 监听核心指标,比如
'first-input-delay'(FID)、'largest-contentful-paint'(LCP) - 将指标与用户行为(如点击按钮、提交表单)关联,判断“慢”是否发生在关键路径上
- 配合错误监控(
window.onerror、PromiseRejectionEvent),区分是性能退化还是逻辑崩溃


















