console.time() 用于快速测量代码段执行耗时,需与同名 console.timeEnd() 成对使用;performance.mark()/measure() 更适合跨函数、异步的端到端性能分析。
console.time() 快速定位慢函数直接测某段代码执行耗时,比猜快得多。它不依赖外部工具,适合开发阶段快速验证。
console.time() 和 console.timeEnd() 必须成对出现,且传入的标签名(字符串)要完全一致,否则 timeEnd() 会报 Timer “xxx” doesn’t exist
console.time(),Chrome 会覆盖上一次计时器,导致结果不准console.time('parseData');
const result = JSON.parse(largeJsonString);
console.timeEnd('parseData'); // 输出:parseData: 124.345ms
performance.mark() + performance.measure() 更适合复杂流程
当你要跨函数、跨异步阶段(比如从点击到渲染完成)测端到端耗时,console.time() 就力不从心了。
performance.mark() 打点无开销,可打多个;performance.measure() 按标记名计算差值,支持异步场景mark() 再 measure(),否则返回 NaN;标记名区分大小写performance.getEntriesByType('measure') 可导出结构化数据,方便自动化分析performance.mark('start-fetch');
fetch('/api/data').then(() => {
performance.mark('end-fetch');
performance.measure('fetch-duration', 'start-fetch', 'end-fetch');
});
这是前端性能隐形杀手——每次读取布局属性(如 offsetHeight)后立刻写样式,浏览器被迫同步重排,严重拖慢帧率。
el.offsetHeight → el.style.height = '200px' → 再读 el.scrollHeight
getBoundingClientRect(), computedStyle)也触发重排,别在循环里反复调用requestAnimationFrame() 批量读写:所有读操作放一帧开头,所有写操作放同一帧末尾chrome://tracing 抓真实用户卡顿帧,比 DevTools 面板更准DevTools 的 Performance 面板默认只录主线程,而 chrome://tracing 能同时捕获 GPU、Raster、V8、IO 等多线程事件,暴露真正瓶颈。
disabled-by-default-v8.runtime_stats,才能看到 JS 函数级耗时(否则只有“Evaluate Script”大块)Long Tasks(>50ms)和 Recalculate Style / Layout 高频区间,它们常对应可优化的代码段实际优化中,最易被忽略的是微任务队列堆积——比如连续 20 次 Promise.resolve().then(...),会阻塞后续渲染帧。这类问题只能靠 tracing 抓到,console.time() 完全测不出来。