system.nanotime() 是 java 中最可靠的性能测量方式,精度达纳秒级,仅用于同 jvm 内差值计算;需预热、避免 jit 优化、精准包裹目标逻辑,并注意单位换算精度与跨线程独立计时。

System.nanoTime() 是 Java 中测量代码执行耗时最可靠的方式,它不依赖系统时钟,精度可达纳秒级(实际有效分辨率通常为几十纳秒),专为性能测量设计。
核心用法:只算差值,不看绝对值
它的返回值本身没有时间意义,仅用于同一 JVM 内两次调用的相减:
- 记录起始: long start = System.nanoTime();
- 执行你要测的代码(尽量简洁、无 I/O、无日志、避开 GC 触发点)
- 记录结束: long end = System.nanoTime();
- 计算耗时: long nanos = end - start;(单位是纳秒)
单位换算要小心类型和精度
纳秒转常用单位时,注意避免整数截断或精度丢失:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 转毫秒(推荐带小数): double ms = nanos / 1_000_000.0;(如输出 "%.3f ms")
- 转微秒: long micros = nanos / 1000;(整除,向下取整)
- 四舍五入到毫秒: long msRounded = Math.round((double) nanos / 1_000_000);
真实业务中容易忽略的关键细节
单次测量结果常失真,必须考虑运行环境干扰:
- JIT 预热未做:首次执行含类加载、解释、编译开销,建议先循环运行几十~几百次再正式采集
- 被测逻辑太短:低于几百纳秒的操作,nanoTime 调用开销占比高,建议重复 N 次后取平均
- 结果未被使用:JIT 可能优化掉整个计算,把关键结果赋给 volatile 变量或用于后续不可省略逻辑(如 return、打印)
- 混入非目标操作:比如在 nanoTime 包裹内打印日志、拼接字符串、触发 GC,会污染测量结果
Runnable 或方法内精准测量业务耗时
别把整个 run() 或方法体包进去,要“扣准”真正关心的逻辑段:
- ❌ 错误:在 run() 开头记 start,结尾记 end —— 中间可能包含线程调度、锁等待、空闲等待
- ✅ 正确:在 doBusinessWork() 调用前后插入 nanoTime,确保只覆盖纯计算或核心处理部分
- 跨线程不共享 start 值:每个线程独立计时,start 和 end 必须在同一线程、同一执行路径中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










