System.currentTimeMillis() 返回自1970年1月1日UTC起的毫秒数,可用于粗略计时:记录起止时间戳并相减;精度约10–15ms,不适用于纳秒级测量;高精度场景应选nanoTime。

System.currentTimeMillis() 返回的是从 1970 年 1 月 1 日 00:00:00 UTC 到当前时刻的毫秒数,它本身不是计时器,但可以作为“打点”工具来实现简单计时:记录开始和结束两个时间戳,相减即得耗时(毫秒)。
基本用法:记录一段代码执行耗时
这是最常见也最直接的方式。在操作前获取一次时间戳,操作后再次获取,差值就是运行时间(单位:毫秒)。
- 适合粗略评估方法、循环、IO 等操作的耗时
- 精度受限于系统时钟分辨率(通常为 10–15ms),不适合微秒级或高精度场景
- 注意:不要用于测量极短时间(如纳秒级运算),误差可能比实际还大
示例:
long start = System.currentTimeMillis();doSomething(); // 比如一个耗时操作
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + " 毫秒");
封装成可复用的简易计时器类
如果多个地方需要计时,可以封装一个轻量 Timer 工具,避免重复写 start/end 变量。
立即学习“Java免费学习笔记(深入)”;
- 内部保存起始时间,在 start() 中记录,在 elapsed() 中计算差值
- 支持多次调用 elapsed() 查看当前已过去时间(不重置)
- 可选添加 reset() 方法重新开始计时
示例(简化版):
public class SimpleTimer {private long startTime;
public void start() {
startTime = System.currentTimeMillis();
}
public long elapsed() {
return System.currentTimeMillis() - startTime;
}
}
对比:为什么不用 nanoTime?
System.nanoTime() 更适合精确计时(如性能压测、算法比较),因为:
- 它基于 CPU 高精度计数器,不受系统时间调整影响(比如 NTP 同步)
- 分辨率更高(通常达纳秒级),且单调递增
- 但返回值无绝对意义(不能转成日期),只适合计算差值
所以:日常简单耗时查看用 currentTimeMillis 足够;对精度、稳定性有要求,优先选 nanoTime。
注意事项与常见误区
- 不要跨 JVM 或长时间运行中依赖该值做“绝对时间差”,系统时钟可能被手动/自动校准,导致结果异常
- 避免在循环内高频调用(虽然开销极小,但没必要)
- 日志中打印耗时时建议带上单位(如 “234 ms”),避免歧义
- 如果要统计平均耗时,注意 warm-up(JIT 编译影响)和 GC 干扰,单次测量意义有限


















