在Java中System.nanoTime如何精确测量时间_Java高精度计时工具解析-java教程

System.nanoTime()仅提供单调递增纳秒值,适合测间隔而非时间戳;其差值为0因分辨率低、JIT优化或调用开销大;不可与currentTimeMillis()混用;微基准测试需预热、避GC、保内联、多次测量。

System.nanoTime() 本身不提供“绝对时间”,它只返回一个单调递增的纳秒级计时值,适合测间隔,不适合做时间戳。它的精度和稳定性取决于底层操作系统与硬件,不是所有平台都能真正达到纳秒级分辨率。

为什么 System.nanoTime() 测出来的时间差有时为 0

常见现象:连续两次调用 System.nanoTime() 相减得 0,尤其在空循环或极短操作中。

  • 底层计时器分辨率有限(如 Windows 上常为 10–15ms,Linux 可能是 1–10ns,但受 CPU 频率调节、虚拟化影响)
  • JIT 编译可能优化掉“无副作用”的代码段,导致实际没执行
  • 单次调用开销本身就可能接近或超过计时器最小可分辨间隔
  • 建议至少重复测量 100 次以上取平均,并用 Thread.onSpinWait() 或简单 volatile 读写防止过度优化

System.nanoTime() 和 System.currentTimeMillis() 能否混用

绝对不能。两者基准不同、更新机制不同、用途完全不同。

  • System.currentTimeMillis() 返回自 1970-01-01 UTC 的毫秒数,受系统时钟调整(NTP、手动修改)影响,可能回跳或跳跃
  • System.nanoTime() 基于某个未公开起点(如 JVM 启动时刻),只保证单调性,不映射到真实时间
  • 拿 System.nanoTime() 减去一个 System.currentTimeMillis() 值毫无意义,结果单位错乱且语义失效
  • 日志打点若需“带时间戳的耗时”,应分别记录 System.currentTimeMillis()(用于排序/对齐)和 System.nanoTime()(用于精确差值)

在微基准测试中如何避免 System.nanoTime() 的典型误用

JMH 是首选,但若手写简易 benchmark,必须绕过几个关键陷阱:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java中System.nanoTime如何精确测量时间_Java高精度计时工具解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003459+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003459+
  • 本周更新: 0+
  • 最后更新: 2026-03-16