system.nanotime()的核心优势在于它是单调时钟,不受系统时间调整影响,保证单调递增,适合精确间隔测量;而system.currenttimemillis()等挂钟时间映射现实日历,易受手动修改或ntp校准导致跳变或倒流。

System.nanoTime() 的核心优势,不在于“纳秒数字大”,而在于它本质上是 Monotonic Clock(单调时钟),与 Wall-clock(挂钟时间)在设计目标、行为特性和适用场景上存在根本差异。
不受系统时间调整干扰
Wall-clock 时间(如 System.currentTimeMillis() 或 new Date())映射到现实世界日历,依赖操作系统维护的“墙上时钟”。一旦用户手动修改系统时间,或 NTP 同步发生跳变(比如向后校准 5 秒),Wall-clock 值会突变甚至倒流——导致耗时计算出现负值或严重失真。
System.nanoTime() 则完全独立:它基于硬件计数器(如 TSC 或 clock_gettime(CLOCK_MONOTONIC)),只反映自 JVM 启动后流逝的物理时间。系统时间被拨快、拨慢、闰秒跳变,对它毫无影响。
保证单调递增,适合间隔测量
Wall-clock 时间可能因校准而回退,而 nanoTime() 的设计契约明确要求:后续调用返回值一定 ≥ 之前调用。这个单调性是可靠测量的前提——你永远不用担心 end - start 得到负数。
即使在多核 CPU 上,JVM 也会尽力同步各核心的计时源。虽然极短间隔(
更高且更稳定的分辨率
Wall-clock 时间的实际精度受 OS 限制:Windows 常为 15.6ms,Linux 通常 1–10ms,且多次调用可能返回相同值;而 nanoTime() 在现代系统上普遍达到 亚微秒级(几百纳秒内)稳定分辨率,适合测量微秒级方法、循环开销或 JVM 内部性能瓶颈。
注意:它提供的是“纳秒级精度”,不是“纳秒级准确度”——底层实现有开销(约 10–30ns),差值低于 1000ns 时多为噪声,不宜轻信。
专为测量而生,语义清晰
System.nanoTime() 的官方说明直截了当:“只能用于测量经过时间,与任何墙钟时间无关”。它的返回值本身无业务含义,也不该转成日期、存数据库或传给 sleep() —— 这种用法混淆了“时间点”和“时间间隔”两种概念。
而 Wall-clock 时间天然适合日志打点、超时控制(if (now - start > 5000))、定时任务触发等需要锚定现实时刻的场景。











