0

0

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

P粉602998670

P粉602998670

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

|

124人浏览过

|

来源于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免费学习笔记(深入)”;

Spell.tools
Spell.tools

高颜值AI内容营销创作工具

下载
  • 不要用它测短耗时(毫秒级以下误差大,且受 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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

401

2023.08.11

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

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

248

2023.10.07

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

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

72

2025.10.23

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

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

478

2023.08.14

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

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

327

2023.08.14

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

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

1795

2023.08.22

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

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

2109

2023.09.19

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

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

284

2023.10.18

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

2

2026.02.27

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.3万人学习

Java 教程
Java 教程

共578课时 | 73.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号