System.currentTimeMillis() 适合粗略计时,用 start/end 两变量相减得毫秒差;可封装为单变量 timer 多次重置;精度约 10–15ms,适用于百毫秒级以上操作,跨线程需独立计时。

用 System.currentTimeMillis() 做变量级计时器,核心就是“开始前记一次时间,结束后再记一次,相减即得毫秒差”。它轻量、无需额外依赖,适合快速诊断某段代码的执行耗时。
基础用法:两行搞定计时
最简实现只需两个 long 变量:
- 定义一个 start 变量,在要测的代码块前调用
System.currentTimeMillis()赋值 - 定义一个 end 变量,在代码块后立即再调用一次,然后用
end - start得到毫秒数
示例:
long start = System.currentTimeMillis();// 这里放你要测量的逻辑,比如 list.sort()、数据库查询等
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + " ms");
封装成可复用的计时变量(推荐)
避免重复声明两个变量,可以封装成一个简单的计时器类或直接用单个 long 字段管理状态:
- 声明一个 long timer 字段(或局部变量)
- 开始时赋值:
timer = System.currentTimeMillis(); - 结束时直接计算:
System.currentTimeMillis() - timer
这样在同一个作用域内,你甚至可以用同一个变量多次“重置”计时(只要重新赋值 start 时间即可)。
注意精度与适用场景
System.currentTimeMillis() 返回的是自 1970-01-01 UTC 的毫秒数,其底层依赖系统时钟,精度通常为 10–15ms(Windows)或更高(Linux/macOS),不适合微秒级或纳秒级精准测量。
- 适合粗略观察方法级、IO 操作、循环批量处理等「百毫秒以上」的耗时
- 若需更高精度(比如性能压测、算法 benchmark),应改用
System.nanoTime() - 不要跨线程共享同一个 start 时间戳——每个线程应独立计时
小技巧:配合日志或条件输出
可以在开发调试时加一层阈值判断,只打印超时的操作:
long start = System.currentTimeMillis();doSomethingExpensive();
long cost = System.currentTimeMillis() - start;
if (cost > 100) { // 超过 100ms 才提醒
log.warn("doSomethingExpensive took {} ms", cost);
}

















