讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中的System.nanoTime与currentTimeMillis区别_高精度计时

云辰同学_4471

云辰同学_4471

发布时间:2026-02-27 12:38:03

|

164人浏览过

|

来源于php中文网

原创

System.nanoTime()适合测代码执行耗时,返回纳秒级单调时间,需两次调用相减;System.currentTimeMillis()是墙钟时间,适合日志和超时,但受系统时钟调整影响;二者不可混用相减。

java中的system.nanotime与currenttimemillis区别_高精度计时

System.nanoTime() 适合测代码执行耗时

它返回的是纳秒级的“单调时间”,不受系统时钟调整影响,专门用来做性能测量。比如你想知道一段 for 循环跑了多少纳秒,或者两个算法谁更快,就该用它。

常见错误现象:System.nanoTime() 返回值是相对起点的差值,不是绝对时间;直接打印它毫无业务意义;有人拿它去算“当前时间”,结果发现和 new Date() 对不上——这很正常,因为它根本不是时间戳。

  • 必须用两次调用相减: long start = System.nanoTime(); doWork(); long elapsed = System.nanoTime() - start;
  • 不能跨 JVM 实例比较(不同进程的 nanoTime 起点不同)
  • 虽然叫“纳秒”,但底层依赖硬件计时器,实际精度通常在微秒级(如 Linux 的 CLOCK_MONOTONIC),别指望真到 1ns

System.currentTimeMillis() 是“墙钟时间”,适合做日志、超时、定时

它返回的是自 1970-01-01 00:00:00 UTC 起的毫秒数,和系统时钟同步。你看到的日志时间、HTTP 请求的 Date 头、Timer 的延迟调度,都靠它。

容易踩的坑:currentTimeMillis() 会随系统时间跳变而突变。比如运维手动把服务器时间往前拨了 5 分钟,所有基于它的超时判断可能瞬间触发;NTP 校准也可能造成小幅度回跳,导致 elapsed = end - start 算出负数。

立即学习“Java免费学习笔记(深入)”;

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 不要用它测短耗时(毫秒级以下误差大,且受 GC 暂停干扰明显)
  • 涉及分布式或跨机器的时间比对,要考虑时钟漂移,不能只信本地值
  • Java 9+ 提供了 java.time.Instant.now(),底层其实也调 currentTimeMillis(),语义更清晰,推荐新代码优先用

为什么不能混用 nanoTime 和 currentTimeMillis 做减法

它们起点不同、单位不同、更新机制不同。一个是从 JVM 启动(或某个硬件事件)开始的单调计数器,一个是实时同步的系统时钟毫秒值。强行相减得到的数字既不是真实时间,也不具备可解释性。

典型错误场景:有人想“校准” nanoTime,写 System.nanoTime() - System.currentTimeMillis(),以为能得出偏移量——这毫无意义,因为两者无数学关系。

  • System.nanoTime() 的值可能远大于 System.currentTimeMillis()(比如几十万亿 vs 十几亿)
  • 二者增长速率也不一致(nanoTime 是稳定递增,currentTimeMillis 可能暂停、跳跃)
  • JVM 不保证两者之间存在固定换算关系,JIT 或 OS 层优化还可能让行为更不可预测

高并发下 nanoTime 的性能开销其实很小

很多人担心频繁调用 System.nanoTime() 影响吞吐,尤其在热点路径里。实际上现代 JVM(HotSpot)已将其内联为单条 CPU 指令(如 x86 的 RDTSCP),耗时通常在 20–50 纳秒,远低于一次 L1 cache miss。

但要注意:如果你在循环里每轮都调一次,又不做聚合,只是存着等最后算差值——那这些中间值基本没用,还占 GC 压力。真正要测的,是关键路径的“头尾差”,不是每个子步骤。

  • 避免在每层方法入口/出口都打 nanoTime 日志(用采样或 AOP 更合适)
  • 注意 JIT 优化可能导致空循环被消除,测出来是 0 —— 加个 Blackhole.consumeCPU() 或写入 volatile 字段来防优化
  • Android 上 nanoTime() 精度较低(常为毫秒级),别默认它和桌面 JVM 表现一致

事情说清了就结束

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2133

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3454

2023.10.07

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

814

2025.10.23

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6596

2023.08.14

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

922

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2747

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

5457

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.10.18

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn