测代码执行时间应使用system.nanotime()而非currenttimemillis(),因其精度高、不受系统时间调整影响、单调递增且分辨率可达纳秒级;标准用法为三行:取起点、执行代码、相减得纳秒耗时。

测代码执行时间,别用 currentTimeMillis() —— 它精度低、易受系统时间干扰,测微秒级操作基本无效。真正靠谱的,是 System.nanoTime(),专为“测多久”而生,不是看“几点钟”。
为什么nanoTime()才是测速的正确打开方式
它不依赖系统时钟,不受NTP校时、手动改时间影响;返回值是单调递增的纳秒计数,分辨率通常在100纳秒以内(Linux下可达1纳秒);JVM启动后原点固定,两次调用相减就是真实耗时。
- 毫秒级方法(
currentTimeMillis())在Windows上最小间隔常达15ms,测一段100微秒的逻辑,结果永远是0 - 纳秒方法能稳定分辨几十纳秒的差异,适合算法对比、锁竞争分析、游戏帧时间统计等场景
- 即使返回值巨大或为负,只要在同一JVM内做差值,结果就绝对可靠
标准写法:三行搞定精准计时
别封装成工具类绕弯子,核心就三步——取起点、执行、取终点、相减。注意别用 long 以外类型,避免溢出或精度丢失。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
long start = System.nanoTime();// 你要测的代码(建议单次执行,避免JIT干扰)long elapsed = System.nanoTime() - start;
得到的是纳秒值,转毫秒用 elapsed / 1_000_000,保留小数可用 (double) elapsed / 1_000_000。
容易踩坑的几个细节
看似简单,实操中常因忽略环境因素导致数据失真:
- JVM刚启动时,JIT还没预热,首次运行可能慢2–3倍,建议先空跑几轮再正式采样
- 单次测量意义不大,应多次运行取中位数或平均值(比如循环100次,去掉最高最低各5个)
- 避免在测量块里打印日志、触发GC或访问磁盘——这些外部开销会污染目标代码的真实耗时
- 不要跨线程或跨JVM比较nanoTime值,它的数值只在当前进程内有意义
什么情况下可以考虑其他方案
nanoTime() 是通用首选,但并非万能:
- 需要记录绝对时间戳(如日志打点、事件排序),必须用
currentTimeMillis()或Instant.now() - 做微基准测试(microbenchmark),推荐用 JMH,它自动处理JIT预热、统计偏差、垃圾回收干扰等问题
- 测量含I/O或网络调用的端到端耗时,nanoTime()依然适用,但要注意系统调用本身的抖动会影响稳定性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










