performance.mark()和performance.measure()可精准测量代码段耗时,精度达微秒级,不受系统时间影响;需先打标记再计算差值,支持清除与监听。

直接用 performance.mark() 和 performance.measure() 配合使用,就能精准测量任意两段代码之间的执行耗时,比 Date.now() 更精确、不受系统时间调整影响。
标记关键时间点
在想测的代码开始前和结束后分别打上标记,用字符串命名便于识别:
-
performance.mark('start')—— 记录起始时刻 -
performance.mark('end')—— 记录结束时刻
标记名必须是合法字符串,避免空格或特殊符号,推荐用小写+下划线(如 'api_fetch_start')。
计算两点间耗时
调用 performance.measure() 指定名称和起止标记,浏览器会自动算出差值并存入性能条目:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
performance.measure('fetch_duration', 'start', 'end')- 之后可通过
performance.getEntriesByName('fetch_duration')取出结果,其中duration字段就是毫秒级耗时(精度可达微秒级)
注意:measure() 不会立即输出,只是记录;如需即时查看,可链式调用后立刻读取:
performance.mark('start');<br>doSomeHeavyWork();<br>performance.mark('end');<br>performance.measure('work_time', 'start', 'end');<br>const entry = performance.getEntriesByName('work_time')[0];<br>console.log(entry.duration); // 如:124.378
清理与避免干扰
频繁打点可能堆积性能条目,影响分析效率:
- 用完后可用
performance.clearMarks()清除指定标记,或performance.clearMeasures()清除测量项 - 开发阶段建议加条件判断,比如只在
location.hostname === 'localhost'时启用测量 - 不要在循环内无节制打点,容易触发性能警告或内存增长
结合 PerformanceObserver 实时监听
适合长期监控或自动化收集场景:
- 创建观察者监听
'measure'类型条目 - 回调中过滤出目标测量名,提取
duration并上报或打印
示例:
const observer = new PerformanceObserver((list) => {<br> list.getEntries().forEach(entry => {<br> if (entry.name === 'work_time') {<br> console.log('耗时:', entry.duration.toFixed(2), 'ms');<br> }<br> });<br});<br>observer.observe({ entryTypes: ['measure'] });

















