system.currenttimemillis()适合粗略测耗时,精度仅10~16ms且受系统时间调整影响;高精度场景应优先用system.nanotime()或jmh等专业工具。

直接用 System.currentTimeMillis() 记录起止时间,相减即可得到毫秒级耗时。它适合粗略评估、非高精度场景(比如调试、简单性能观察),但要注意它的精度和稳定性限制。
基本用法:两行搞定
在逻辑代码段前后各调用一次 System.currentTimeMillis(),保存返回值,相减:
long start = System.currentTimeMillis();
// ? 这里放你要测的代码
doSomethingExpensive();
long end = System.currentTimeMillis();
<p>long costMs = end - start; // 单位:毫秒
System.out.println("耗时:" + costMs + " ms");
</p>为什么叫“粗略”?关键限制要知道
System.currentTimeMillis() 返回的是系统当前时间戳(自 1970-01-01 UTC 起的毫秒数),它依赖系统时钟,不是单调递增的计时器。这意味着:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 可能受系统时间调整影响(如 NTP 同步、手动改时间),导致结果为负或异常大
- 分辨率通常只有 10~16ms(取决于操作系统),短于这个量级的耗时测不准,甚至恒为 0
- 不适合测量微秒/纳秒级操作,也不适合做高频、多轮精确对比
更推荐的替代方案(真要准一点)
如果需要更高精度、不受系统时钟干扰,应优先用:
-
System.nanoTime():返回纳秒级单调时间,适合测量耗时(推荐用于性能测试) - JVM 自带工具如 JMH(Java Microbenchmark Harness):专为可靠微基准测试设计
- APM 工具(如 SkyWalking、Arthas):线上真实调用链耗时分析
例如用 nanoTime:
long start = System.nanoTime(); doSomethingExpensive(); long end = System.nanoTime(); long costNs = end - start; double costMs = costNs / 1_000_000.0; // 转毫秒(保留小数)
实际使用小提醒
- 避免只测一次:单次结果波动大,建议循环多次取平均(注意 JIT 预热)
- 不要把日志打印、IO、GC 等无关操作包进测量范围
- 生产环境慎用——频繁调用
currentTimeMillis()本身开销极小,但日志或监控埋点可能有副作用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










