system.currenttimemillis()通过执行前后两次调用相减获取毫秒级耗时,适合粗略评估和日志记录;但精度有限、受系统时钟影响,极短操作应改用system.nanotime()。

用 System.currentTimeMillis() 测量程序执行时间,核心就是“执行前记一次时间,执行后记一次时间,相减得到毫秒数”。它简单、通用,但精度有限(通常为毫秒级),适合粗略评估或日志记录。
基本用法:前后两次调用相减
在代码开始处获取起始时间戳,结束处再获取一次,差值即为耗时(单位:毫秒):
- 起始时间:
long start = System.currentTimeMillis(); - 执行目标逻辑(比如一段计算、IO操作等)
- 结束时间:
long end = System.currentTimeMillis(); - 耗时计算:
long duration = end - start;
注意点:避免常见误区
这个方法看似简单,但容易踩坑:
- 不能跨 JVM 或重启使用:返回的是自 1970-01-01 00:00:00 UTC 起的毫秒数,不是“程序启动后”的相对时间,但做差后不影响结果
- 受系统时钟影响:如果运行中系统时间被手动调整或 NTP 同步校正,可能导致负值或异常大值(虽少见,但生产环境需留意)
-
不适合测极短操作:比如纳秒级方法调用,毫秒级精度可能全为 0;此时应改用
System.nanoTime()
实用示例:包装成可复用的计时块
可以封装一个简易计时器,让代码更清晰:
long start = System.currentTimeMillis();
// do something heavy
List<string> result = processData(input);
long cost = System.currentTimeMillis() - start;
System.out.println("处理耗时:" + cost + " ms");</string>
若频繁使用,也可写个工具方法或用 try-with-resources 风格(需自定义类),但对简单场景,直接两行足够。
对比 nanoTime:什么情况下该换?
当需要更高精度或排除系统时钟干扰时,优先选 System.nanoTime():
- 它基于 CPU 计数器,不受系统时间修改影响
- 单位是纳秒,更适合测量微小耗时(如算法性能对比)
- 但注意:
nanoTime()返回值无绝对意义,只用于计算差值 - 日常日志、接口响应时间统计,
currentTimeMillis()完全够用且更直观(直接对应“多少毫秒”)
不复杂但容易忽略细节。用对场景,它就是最轻量可靠的计时方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











