System.currentTimeMillis()适用于毫秒级粗粒度耗时测量,需用long变量记录起止时间并置于待测逻辑正上下方;受系统时钟影响,不适用于高精度或长时间测量,微秒/纳秒级应选System.nanoTime()。

直接用 System.currentTimeMillis() 记录开始和结束时间,相减就能得到毫秒级耗时,简单有效。
获取执行前后的两个时间戳
在代码执行前调用一次 System.currentTimeMillis() 获取起始时间,执行完关键逻辑后再调用一次获取结束时间。两者差值即为耗时(单位:毫秒)。
- 起始时间建议放在待测逻辑的**正上方**,避免初始化开销干扰
- 结束时间必须放在待测逻辑的**正下方**,不要包含后续无关操作
- 注意变量类型用
long,防止 int 溢出(比如超过 24 天的毫秒数)
常见写法示例
最简形式如下:
long start = System.currentTimeMillis();
// 这里放你要测试的代码,比如数据库查询、文件读取、算法计算等
doSomethingExpensive();
long end = System.currentTimeMillis();
long cost = end - start;
System.out.println("耗时:" + cost + " ms");如果想更清晰,可封装成小工具方法,但对单次统计来说没必要过度设计。
注意事项和局限性
System.currentTimeMillis() 返回的是系统当前时间(基于 UTC 的毫秒数),受系统时钟调整影响(如 NTP 同步、手动改时间),不适合高精度或跨长时间的性能测量。
- 适合粗粒度、短时间(毫秒级)的耗时观察,比如接口响应、批量处理
- 不适用于微秒/纳秒级精度需求,此时应改用
System.nanoTime() - 多线程环境下各自记录互不影响,但要注意避免日志输出本身带来额外延迟
对比 nanoTime 更适合什么场景
如果需要排除系统时钟跳变干扰,或测量极短操作(如循环内单次计算),推荐用 System.nanoTime() ——它基于 CPU 纳秒计时器,不受系统时间修改影响,且分辨率更高。
-
currentTimeMillis():看“现实过了多久”,适合业务耗时上报、日志打点 -
nanoTime():看“CPU 花了多少时间”,适合性能压测、算法 benchmark

















