You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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就会变成固定值,后续循环自然不会再变化。

验证与调整建议

  1. 确认系统时钟精度
    • 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 查看时钟分辨率。
  2. 测试更长耗时的操作
    大幅增加内层循环次数(如改为j < 1000000),或加入字符串拼接、IO等更耗时的操作,让操作耗时超过100ns,就能看到System.nanoTime()返回值变化,tpValue也会随之改变。
  3. 关于精度的认知
    System.nanoTime()的核心价值是计算相对时间间隔,而非提供绝对纳秒级时间戳。即使精度为100ns,它计算出的时间间隔仍然准确,不会影响性能测试等场景的结果。

内容的提问来源于stack exchange,提问作者Yhirton Iowert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:27:43