System.nanoTime() 不是微秒计时器,而是基于操作系统单调时钟的纳秒级高分辨率时间源,实际精度通常为10–100纳秒,通过差值计算(end−start)/1000可可靠获取微秒级耗时,适用于性能测量而非绝对时间。

System.nanoTime() 本身返回的是纳秒级数值,但它的精度和稳定性取决于底层操作系统和硬件,并不直接“实现”微秒级计时——而是提供足够高的分辨率,让你能从中提取微秒级时间差。
它不是微秒计时器,而是高分辨率时间源
Java 的 System.nanoTime() 调用的是操作系统提供的单调时钟(如 Linux 的 CLOCK_MONOTONIC),其单位是纳秒,但实际精度通常在几纳秒到几十纳秒之间(常见为 10–100 ns)。这意味着:
- 返回值是纳秒单位的 long 类型,数值很大,但不表示绝对时间(不能转成日期)
- 它适合测时间间隔(Δt),不适合做时间戳或定时调度
- 两次调用差值除以 1000 就得到微秒数,例如:
(end - start) / 1000L
为什么能用于微秒级测量?
虽然单次调用可能有几十纳秒误差,但只要测量的是同一段代码执行耗时(且持续时间远大于时钟分辨率),误差占比就很小。比如一段耗时 10 微秒(10,000 ns)的操作,若时钟分辨率为 50 ns,相对误差约 0.5% —— 对多数性能分析已足够。
- 避免使用
System.currentTimeMillis():它精度通常只有 10–15 ms,且受系统时间调整影响 - 不要期望“精确到 1 微秒”:硬件限制决定了最小可分辨间隔,nanoTime 不保证亚微秒精度,但能可靠分辨 >1 μs 的差异
- JVM 和 OS 会尽量选择最高精度的时钟源(如 TSC 在支持 RDTSCP 的 CPU 上)
正确用法示例
微秒级计时的关键是:只关心差值、避免干扰、多次采样取平均。
立即学习“Java免费学习笔记(深入)”;
- 记录起点:
long start = System.nanoTime(); - 执行待测逻辑(注意避免 JIT 预热影响,建议预热几轮)
- 记录终点:
long end = System.nanoTime(); - 换算为微秒:
long microseconds = (end - start) / 1000L; - 若需更高置信度,重复测量多次,去掉最高最低值后取平均
注意事项和常见陷阱
实际使用中容易忽略这些细节,导致结果失真:
- JIT 编译干扰:首次运行可能被解释执行,后续才优化。应先预热(如循环执行 10000 次)再正式计时
- 上下文切换/中断:短于几十微秒的操作易受线程调度影响,建议测量总耗时较长(≥100 μs)的逻辑块
- 溢出风险:nanoTime 值约每 292 年翻转一次,正常程序无需担心;但计算差值时要用 long,别用 int
- 跨核不一致:老式多核 CPU 上 TSC 可能不同步,现代 JVM 会自动检测并 fallback 到更稳定的时钟源


















