JAVA System.nanoTime()与GO time.Now().UnixNano()区别

news2024/9/28 23:22:46

JAVA System.nanoTime()

    public static void main(String[] args) {
        long nano = System.nanoTime();
        System.out.println(nano);
    }

输出:701863191254000,这个值有点奇怪,System.currentTimeMillis()不是System.nanoTime()的1000000倍。

这个值是个什么值,先看一点源码注释:

Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds.
返回正在运行的Java虚拟机的高分辨率时间源的当前值,单位为纳秒。
(我理解就是指,这个纳秒值就是Java虚拟机能获取的最高精度的时间值了。)


This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.
这种方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的起始时间以来的纳秒(可能在将来,因此值可能为负值)。在Java虚拟机的实例中,此方法的所有调用都使用相同的原点;其他虚拟机实例可能使用不同的来源。
(1、这个纳秒时间跟标准时间无关,要用也只能用来比如计算方法执行时间等。2、这个值的起始时间不是笃定的。3、不同虚拟机下边获取这个时间可能还不同。)

This method provides nanosecond precision, but not necessarily nanosecond resolution (that is, how frequently the value changes) - no guarantees are made except that the resolution is at least as good as that of currentTimeMillis().
此方法提供纳秒精度,但不一定是纳秒分辨率(即值更改的频率)-除了分辨率至少与currentTimeMillis()一样好之外,没有任何保证。


Differences in successive calls that span greater than approximately 292 years (263 nanoseconds) will not correctly compute elapsed time due to numerical overflow.
由于数值溢出,跨度超过约292年(263纳秒)的连续调用之间的差异将无法正确计算所用时间。


The values returned by this method become meaningful only when the difference between two such values, obtained within the same instance of a Java virtual machine, is computed.
只有当计算在Java虚拟机的同一实例中获得的两个这样的值之间的差时,此方法返回的值才有意义。

怎么计算得来的,看下懂C的人分析:JVM源码分析之System.currentTimeMillis及nanoTime原理详解

里边有句重点:

我们JVM里取纳秒数时传入的是CLOCK_MONOTONIC这个参数,因此会调用如下的方法

上面的wall_to_monotonic的tv_sec以及tv_nsec都是负数,在系统启动初始化的时候设置,记录了启动的时间。因此nanoTime其实算出来的是一个相对的时间,相对于系统启动的时候的时间。 

而System.currentTimeMillis()是返回的当前时间距离1970/01/01 08:00:00的毫秒数。

GO time.Now().UnixNano()

time.Now().UnixNano()

执行结果:1681209667509687900,结果与JAVA的获取纳秒时间相差太多。看GO的源码注释:

// UnixNano returns t as a Unix time, the number of nanoseconds elapsed
// since January 1, 1970 UTC. The result is undefined if the Unix time
// in nanoseconds cannot be represented by an int64 (a date before the year
// 1678 or after 2262). Note that this means the result of calling UnixNano
// on the zero Time is undefined. The result does not depend on the
// location associated with t.
func (t Time) UnixNano() int64 {
	return (t.unixSec())*1e9 + int64(t.nsec())
}

重点就是这句:UnixNano返回t作为Unix时间,即自1970年1月1日UTC以来经过的纳秒数。

这个就是GO与JAVA(nanoTime其实算出来的是一个相对的时间,相对于系统启动的时候的时间。 )区别太大的原因。

如何使用JAVA计算与GO相同的纳秒呢?可以留言讨论。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【springcloud开发教程】路由网关——zuul

官方资料:https://github.com/Netflix/zuul/ 什么是Zuul? Zuul包含了两个主要的功能:路由和过滤 路由功能将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预&#…

Ubuntu环境安装指定版本的docker 和一键卸载dockerdocker-compose

一、环境 我的linux系统是Ubuntu 22.04 二、开始安装 卸载旧版 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine docker-ce docker.io更新apt包索引 $ sudo apt-get update安装以下…

基础工业工程(易树平、郭伏)——第四章 程序分析

第四章 程序分析 第一节 程序分析概述 一、程序分析的概念、特点及目的 1.程序分析的概念 程序分析是一种重要的生产管理工具,它是依照工作流程,从第一个工作地到最后一个工作地,全面地分析有无多余、重复、不合理的作业&…

【单片机/普中A2】学习笔记3-数码管

数码管主要概念 参考文献:点击前往 数码管分类 字形重叠数码管:将不同数字、字母与符号重叠,需要用到那个就显示那个 分段式数码管:最常见的数码管,按照笔画来显示,主要有七段式和八段式数码管 点矩阵式…

JavaScript 代码整洁之道

文章目录概述篇变量篇函数篇注释篇异常处理篇复杂判断函数篇重构篇参考资料概述篇 书写能让人读懂的代码使用英语编写代码团队协作 制定通用的规则,依靠工具让团队的代码风格保持统一,要让代码看起来是由一个人编写的,消除个人的代码风格。…

这么好看的客服组件,还是觉得接入ChatGPT,把它放在博客中那就完美了

我们在使用ChatGPT时,它的返回方式是采用流式回复。感觉这个效果不错。之前做的全都是的等全部结果请求完成,再一次性返回给用户。今天就通过流式回复的效果重写之前的程序。 前端 前端采用一个网页版的客服组件,整体的效果如下:…

小白学Pytorch系列- -torch.distributions API Transforms (2)

小白学Pytorch系列- -torch.distributions API Transforms (2) AbsTransform AffineTransform 通过逐点仿射映射进行转换yloc⁡scale xy\operatorname{loc}\text { scale } \times xyloc scale x loc (Tensor or float) : 位置参数scale (Tensor or float) : 尺度参数event…

k8s Deployment

一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod rs v1控制三个pod,删除一个pod,在rs v2上重新建立一个,依次类推,直到全部都是由rs v2控制,如果rs v2有问题,还可以…

Spark on Yarn(client和cluster模式,spark-shell 和 spark-submit 的区别,WorldCount实现与理解)

文章目录Spark on Yarn两种模式clientclusterspark-shell 和 spark-submit 的区别的理解spark-shellspark-submitWorldCount实现IDEA本地实现On Yarn 实现WorldCount图解Spark on Yarn spark on yarn 的两种模式是指 spark 应用程序的 driver 进程(负责控制和协调整…

JAVA8的Optional类,还用 != null 判空?

在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince(); 这种写法,在…

springboot整合mybatis(idea)

从idea新建项目 选择spring启动* help、mvnw 文件可以删除 springBoot3.0需要的最小JDK是JDK17,当低于17的时候会报错。 改成2.7.6 新建控制层Controller、Mapper层和Model文件夹 必须在springBoot启动项下面新建,不然无法识别。 允许XML进入target…

Java - 泛型

一、什么是泛型? 一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。 泛型是在JDK1.5…

初次使用yolov8遇到的问题

记录第一次使用yolo8跑自己的数据; 首先将官方文档看一下,大概捉摸了2个小时,地址:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite 获得了基本的一些了解&#x…

$\Beta$分布推导与可视化

$\Gamma$函数 $\Gamma$函数(Gamma函数)是阶乘函数在实数和复数域的扩展。对于正整数$n$,阶乘函数表示为$n! 1 \times 2 \times ... \times n$。然而,这个定义仅适用于正整数。Gamma函数的目的是将阶乘扩展到实数和复数域,从而计算实数和复数…

代码随想录【链表】--->删除倒数第N个节点、链表相交、环形链表

⭐️代码随想录⭐️ 数组篇: 二分查找 移除数组 有序数组的平方 长度最小的数组 螺旋矩阵 链表篇: 链表移除 设计链表 反转链表 交换链表中的节点 文章目录19. 删除链表的倒数第 N 个结点思路代码面试题 02.07. 链表相交思路代码142. 环形链表 II思路判断链表有环确…

ARM 制作简易的根文件系统

一、根文件系统概述 1、为什么需要根文件系统 (1) init 进程这个应用程序,在根文件系统上。 (2) 根文件系统提供了根目录:/。 (3) 内核启动后的应用层配置(/etc 目录),在根文件系统上。几乎可以认为:发行版 内核 rootfs。 …

Arduino开发之如何连接压力传感器模块?

文章目录0.引言1.压力传感器模块说明2.代码编写3.功能演示0.引言 在利用Arduino开发过程中,若需知道设备能感知到受到外部按压,设备可以通过压力传感器模块来感知周围环境。本文在【Arduino如何进行开发?】基础上,借鉴现有网络资料…

数字营销新宠:探究2023年YouTube网红营销的核心趋势和商业价值

2023年,YouTube网红营销已经成为全球广告营销行业的重要组成部分。YouTube作为全球最大的视频分享平台,每月活跃用户数达到了20亿,其中有超过100万的YouTube网红在平台上分享自己的创意和想法。在这篇文章中,Nox聚星将和大家探讨2…

Visual Studio如何使用Qt开发桌面软件?

文章目录0.引言1.开发环境配置2.编写第一个Qt程序0.引言 笔者熟悉的第一门编程语言是C#,当初本科毕业设计需要进行Qgis的二次开发,本想利用C#编程,但网上资料较少,多是利用Qt进行Qgis的二次开发,Qt是利用C编程&#xf…

如何将aac转化为mp3,4种常用方法

aac是高级音频编码格式之一,支持多声道、解析度高,与mp3相比,aac格式的音质更佳,文件更小。在手机上录音时,保存下来的录音文件通常是AAC格式的。虽然aac格式有很多优点,但是,在不同的设备上&am…