关键性能标记须锚定用户可感知的渲染就绪节点,而非js执行瞬间;需用requestanimationframe校验可见性,命名小写短横线且唯一,measure须显式配对并主动上报。

关键性能点不能只靠代码执行位置来打,得落在用户真正感知到、浏览器已确认完成、且业务语义明确的节点上。
标记必须锚定在“渲染就绪”而非“JS调用瞬间”
DOM 插入后立刻 performance.mark('list-rendered') 很可能只记录了 JS 写入完成,还没经历样式计算、布局、绘制。用户看到内容前,这些阶段缺一不可。
- 单个元素插入:用
requestAnimationFrame回调,在下一帧检查node.isConnected && node.offsetHeight > 0 - 批量列表渲染:所有节点 append 后,检查关键容器
getComputedStyle(el).display !== 'none'且el.children.length > 0再打点 - 避免在节流或循环里重复打同名 mark,否则
performance.measure()默认只取第一个,导致耗时失真
命名要有业务语义,且严格唯一
mark 名不是调试日志,而是后续聚合分析的维度依据。名字混乱,指标就无法归因。
- 统一用小写字母 + 短横线,例如
'search-submit-start'、'product-card-visible' - 禁止拼接动态值(如
'item-' + id),否则无法统计 p95/p99 或做趋势分析 - 同一业务链路中,准备、触发、响应、渲染、可见等阶段,各用一个独立名称,不复用
- 上线前用
performance.getEntriesByName('xxx', 'mark').length验证是否真实落进 PerformanceEntry —— 返回 0 就说明打点失效
measure 要显式配对,不能依赖默认时间
performance.measure() 不是自动计时器,只是查表做减法。两个 mark 都得存在,且顺序合理。
- 起始 mark 必须在
measure调用前已注册,否则静默失败(无报错、无条目) - 避免省略
endMark而依赖performance.now(),尤其在异步链路中,当前时间可能远滞后于真实完成时刻 - measure 名建议带前缀便于过滤,如
'time-to-search-results'或'ui-form-submitted-ms' - 关键路径推荐显式成对:先
mark('x-start'),再mark('x-end'),最后measure('x-duration', 'x-start', 'x-end')
数据要主动上报,不能只留在内存里
标记和测量结果默认只保留在内存中,页面关闭即丢失。必须通过可靠方式采集并发送。
- 推荐使用
PerformanceObserver监听'measure'类型,配合sendBeacon上报,抗压不丢数 - 上报内容需含关键维度字段:页面路径、设备类型、网络类型、用户分群标识等
- 也可在关键流程结束或
beforeunload时主动拉取:performance.getEntriesByType('measure').filter(m => m.name.startsWith('time-to-'))
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











