System.nanoTime()输出始终带两个尾零,该现象是否正常?
System.nanoTime()输出末尾始终带两个零的原因分析
核心原因:依赖平台时钟源的实际精度
System.nanoTime()标称精度为纳秒级,但实际精度由底层硬件和操作系统的时钟源决定,并非所有平台都能达到真正的1纳秒分辨率。
你遇到的末尾两个零的情况,说明当前系统的时钟源精度是100纳秒(返回值为100的整数倍),常见场景包括:
- Windows系统默认使用的时钟源(如
QueryPerformanceCounter)多为100ns精度; - 部分x86笔记本的TSC(时间戳计数器)被操作系统分频,或CPU主频非1GHz整数倍,导致时钟刻度无法达到1纳秒;
- Linux部分发行版默认配置的时钟源分辨率为100ns级别。
为什么tpValue始终不变?
你的内层循环操作耗时极短,远小于100ns的时钟精度间隔。这意味着每次调用System.nanoTime()返回的数值完全相同,导致value = 0x4b38e & System.nanoTime()的结果固定。
而tpValue = (tpValue & value) | (tpValue ^ value)本质等价于tpValue | value(可通过布尔运算推导验证)。当value固定时,第一次运算后tpValue就会变成固定值,后续循环自然不会再变化。
验证与调整建议
- 确认系统时钟精度
- Windows:执行命令
wmic path Win32_PerfFormattedData_Counters_TimerPerformance get TimestampFrequency,分辨率 = 1e9 / 频率,结果为100则对应100ns精度; - Linux:查看当前时钟源
cat /sys/devices/system/clocksource/clocksource0/current_clocksource,并通过cat /proc/timer_list查看时钟分辨率。
- Windows:执行命令
- 测试更长耗时的操作
大幅增加内层循环次数(如改为j < 1000000),或加入字符串拼接、IO等更耗时的操作,让操作耗时超过100ns,就能看到System.nanoTime()返回值变化,tpValue也会随之改变。 - 关于精度的认知
System.nanoTime()的核心价值是计算相对时间间隔,而非提供绝对纳秒级时间戳。即使精度为100ns,它计算出的时间间隔仍然准确,不会影响性能测试等场景的结果。
内容的提问来源于stack exchange,提问作者Yhirton Iowert
相关产品推荐
相关产品推荐

