如何用 console.time 记录一段简单循环逻辑的执行耗时并不只看表面做法,关键还要理解相关条件、限制和后续影响。
console.time 是轻量级计时 API,适合测同步逻辑大致耗时;对简单 for 循环可信(误差约 0.1ms),但无法精确测量微秒级或受事件循环干扰的操作。
console.time 是浏览器和 Node.js(v8.5+)都支持的轻量级计时 API,适合快速验证某段同步逻辑的大致耗时。但它不能精确测量微秒级或受事件循环干扰严重的操作——比如空循环、纯计算密集型但被 JIT 优化掉的代码,或者夹杂了 setTimeout、Promise.then 的异步逻辑。
对简单 for 循环这类同步、无 I/O、无 GC 干扰的场景,console.time 给出的结果是可信的,误差通常在 0.1ms 内。
最常见错误是调用 console.timeEnd 时传入的标签名和 console.time 不一致,或漏写标签——这时会输出 undefined 或直接报 Timer 'xxx' doesn't exist 错误。
console.time('loop') → console.timeEnd('loop')
console.time() 和 console.timeEnd() 在部分旧版 Node 中行为不可靠,建议始终带标签'my loop ' 结尾有空格就匹配不上)正确示例:
console.time('simple-loop');for (let i = 0; i < 1e6; i++) { Math.sqrt(i);}console.timeEnd('simple-loop');
当循环体极轻(如空循环或只做 i++),总耗时低于计时器分辨率(通常为 0.001ms),控制台就会显示 0.000ms。这不是 bug,是精度限制。
1e4 改成 1e7),或让循环体更“重”一点(如加一次 Math.random() + JSON.stringify)1e9 次可能卡死页面;Node 中也要防栈溢出或进程假死process.hrtime()(Node)或 performance.now()(浏览器)Node.js 从 v8.5 开始支持 console.time,但早期版本(如 v6.x)不支持,直接运行会报 console.time is not a function。
node -v,确保 ≥ 8.5console.time 会覆盖前一个计时器,导致 timeEnd 返回异常值require() 被其他模块加载的,确保计时块不跨模块边界——console.time 是全局状态,容易被意外干扰稳妥写法:
const label = `loop-${Date.now()}`;console.time(label);for (let i = 0; i < 1e6; i++) i++;console.timeEnd(label);实际用的时候,别只信单次结果;同一段循环多跑几次,取中位数更稳。另外,V8 的 TurboFan 编译器可能把整个循环优化掉(尤其没副作用时),加个 console.log(i) 或把结果赋给全局变量,能防止误判。