console.time()和console.timeEnd()可毫秒级精准测量代码执行时间,需标签严格匹配、覆盖所有异步分支,并支持多标签嵌套计时。

直接用 console.time() 和 console.timeEnd() 就能快速测出某段代码实际跑了多久,毫秒级精度,不用装库、不改逻辑,适合开发调试和初步性能排查。
基础用法:标签必须严格匹配
调用 console.time('label') 开始计时,之后在对应位置调用 console.timeEnd('label') 结束并打印耗时。两个方法传入的字符串必须完全一致(包括大小写和空格),否则控制台会显示 0ms 或报错“timer not found”。
- 正确示例:
console.time('api-call');→console.timeEnd('api-call'); - 错误示例:
console.time('apiCall');配console.timeEnd('api-call');—— 不会输出有效时间 - 标签可重复使用:多次
time('load')后每次timeEnd('load')都只匹配最近一次启动
异步场景:timeEnd 必须落在完成点
JavaScript 是单线程的,console.time() 不会自动等待 Promise、fetch、setTimeout 等异步操作结束。如果在异步发起后立刻调用 timeEnd(),测出来的是“发起耗时”,不是“真正完成耗时”。
- 推荐用
async/await写法,确保timeEnd在数据真正拿到后执行 - 所有分支都要覆盖:成功、失败、超时路径都得有
timeEnd,避免计时器悬空 - 示例:
console.time('fetch-user');
fetch('/user').then(res => res.json()).then(data => {
console.timeEnd('fetch-user'); // ✅ 正确位置
}).catch(err => {
console.timeEnd('fetch-user'); // ✅ 异常也要收尾
});
嵌套与批量测试:一个页面多个独立计时器
不同标签之间互不影响,可以同时开启多个计时器,也支持嵌套(比如外层测总流程,内层测某一步骤)。这对分析复杂函数内部各环节耗时特别有用。
- 适合循环中逐次测量:
for (let i = 0; i - 适合对比不同实现:
console.time('map'); arr.map(...); console.timeEnd('map');和console.time('for-loop'); for(...) {...} console.timeEnd('for-loop'); - 浏览器 DevTools 的 Timeline 面板也会同步标记这些计时点,方便结合主线程活动一起看
上线前注意:别让 time 变成隐患
console.time 和 console.timeEnd 属于调试专用 API,在生产环境一般应移除或屏蔽。虽然它们本身不抛错,但若混在大量未清理的 console.log 中,可能暴露内部逻辑、增加包体积,甚至被用于恶意逆向分析。
- 构建时可通过 Babel 插件(如
babel-plugin-transform-remove-console)自动删除所有console.*调用 - 手动清理时注意:
time和timeEnd成对出现,漏删一个会导致后续同名计时异常 - 临时调试可用条件包裹:
if (process.env.NODE_ENV === 'development') { console.time('xxx'); ... console.timeEnd('xxx'); }


















