`
somefuture
  • 浏览: 1091046 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java的nanoTime()

 
阅读更多

java有两个获取和时间相关的秒数方法,一个是广泛使用的

System.currentTimeMillis()
 

返回的是从一个长整型结果,表示毫秒。

另一个是

System.nanoTime()
 

返回的是纳秒。

 

“纳”这个单位 一般不是第一次见。前几年相当火爆的“纳米”和他是同一级别。纳表示的是10的-9次方。在真空中,光一纳秒也只能传播30厘米。

比纳秒大一级别的是微秒,10的-6次方;然后是就是毫秒,10的-3次方。

纳秒下面还有皮秒、飞秒等。

 

既然纳秒比毫秒高10的6次方精度,那么他们的比值就应该是10的6次方。然而并非如此。

看下面的代码

public static void main(String[] args) {
    long l = System.currentTimeMillis();
    Date date = new Date(l);
    System.out.println(l);
    System.out.println(date);
}
 

最后输出的当前时间。

大家可能都知道毫秒方法返回的是自1970年到现在的毫秒数。而Java的日期也是如此,所以他俩是等值的。

但是使用纳秒方法的输出可能让我们丈二和尚摸不着头脑:

public static void main(String[] args) {
    long l = System.nanoTime();
    Date date = new Date(l / 1_000_000);
    System.out.println(l);
    System.out.println(date);
}
 

这个输出在不同的机器上可能不一样,我的输出是Fri Jan 02 07:58:38 CST 1970

 

为什么会这样?

根据纳秒方法的注释:

Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds.
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.

翻译一下就是:返回当前JVM的高精度时间。该方法只能用来测量时段而和系统时间无关。它的返回值是从某个固定但随意的时间点开始的(可能是未来的某个时间)。不同的JVM使用的起点可能不同。

 

这样有点恐怖的是我们相同的代码在不同机器运行导致结果可能不同。

所以它很少用来计算。通常都是测量。

 

下面写一个程序来反映他和毫秒方法的关系。

  Lists.newArrayList(1,2,3,4,5,6,7,8,9).parallelStream().forEach(i -> {
        long m = System.currentTimeMillis();
        long n = System.nanoTime();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ignored) {
        }
        long m1 = System.currentTimeMillis();
        long n1 = System.nanoTime();
        long m0 = m1 - m;
        long n0 = n1 - n;

        System.out.println(i + " -- " + (n0 / m0));
    });
}
 

输出如下:

3 -- 999756
6 -- 1000129
2 -- 999984
4 -- 999868
5 -- 999019
1 -- 999100
8 -- 999768
7 -- 999753
9 -- 1000139

不同的测试可能结果不同,不过可以看到,这个比值大约是10的6次方。

0
0
分享到:
评论

相关推荐

    nanotime:返回当前纳米时间。 用于制作 id

    "nanotime"这个概念,正如标题所提及的,指的是能够返回当前时间的纳米级别精度的函数或工具。在JavaScript中,虽然内置的Date对象可以提供毫秒级别的精度,但当需要更高精度的时间戳时,就需要借助如"nanotime"这样...

    JAVA版本标准纳秒实现

    1、JAVA版本标准纳秒实现(19位) 2、解决System.nanoTime();并不代表实际时间纳秒的问题。 3、解决解决System.nanoTime();不同JVM获取值不一致的问题。 4、解决解决System.nanoTime();值无法与毫秒时间换算问题。 5...

    java程序_秒表

    秒表功能可以通过多种方式实现,包括使用Java内置的`System.nanoTime()`方法,或者使用`java.time`包中的类。下面我们将深入探讨如何使用Java创建一个秒表类以及相关的知识点。 首先,`System.nanoTime()`方法返回...

    java 记录程序执行的时间

    对于更精确的计时,Java 5及以上版本引入了`java.util.concurrent.TimeUnit`和`System.nanoTime()`。`nanoTime()`返回的是自Java虚拟机启动以来的纳秒数,虽然不直接对应于实际时间,但可用于计算时间差。结合`...

    某大学往年期末考试题:Java考试(含答案).docx

    同时,使用`System.nanoTime()`记录开始和结束时间,计算拷贝过程所耗费的时间。 以上是对Java考试题中涉及知识点的详细解释,这些内容涵盖了Java编程的基础和核心概念,对于理解和掌握Java语言至关重要。

    java下载网络图片

    在Java编程中,下载网络图片是一项常见的任务,尤其在数据抓取、网页爬虫或构建图形界面应用时。本教程将深入讲解如何使用Java实现多线程下载网络图片,并涉及日志记录和网络速度监控。 首先,我们需要了解HTTP协议...

    java统计方法执行时长

    首先,我们可以使用Java内置的`System.currentTimeMillis()`或`nanoTime()`方法来获取当前时间点,以此作为计时起点。在方法执行完毕后,再获取一次当前时间,通过两者之差计算出方法的执行时间。例如: ```java ...

    cpu进程调度 java编写

    此外,可能会使用`System.nanoTime()`来获取精确的时间戳,以模拟实际的进程执行时间。 为了测试和验证模拟器的正确性,通常会设计一系列的测试用例,包括不同数量的进程、不同的执行时间和优先级等场景,通过对比...

    java监控linux cpu使用率

    更常见的是使用Java的`java.lang.management`包,该包提供了管理和监视Java虚拟机(JVM)以及操作系统的工具。 具体来说,可以使用`OperatingSystemMXBean`接口,它是`ManagementFactory.getOperatingSystemMXBean...

    Java实现的耗时统计类-可用于测试程序耗时

    1. **开始计时**: 在执行关键操作前,通过调用一个方法(如`start()`)来记录当前时间,这通常是通过`System.nanoTime()`获取高精度的时间戳。 2. **结束计时**: 当操作完成后,调用另一个方法(如`stop()`)来记录...

    java利用delayedQueue实现本地的延迟队列

    Java 利用 DelayedQueue 实现本地的延迟队列 DelayedQueue 是 Java 中的一种特殊的阻塞队列,它用于存放实现了 Delayed 接口的对象。这种队列是有序的,即队头对象的延迟到期时间最长。 DelayedQueue 能够满足我们...

    十分有用的java小结

    十分有用的 Java 小结 在这篇文章中,我们将讨论 Java 编程语言中的一些基础知识和输入输出处理技巧,这些技巧对于 ACM 竞赛和OI竞赛尤其重要。 一、Java 之 ACM 注意点 在 ACM 竞赛中,Java 程序员需要注意以下...

    java程序运行跟踪利器Btrace分享

    Java程序在运行过程中可能会遇到各种问题,如性能瓶颈、内存泄漏、线程阻塞等,这时,开发者需要有一种工具能够实时地对JVM进行监控和分析。Btrace就是这样一款强大的工具,它允许开发者在不重启Java应用的情况下,...

    momomo.com.platform.Nanotime:从Java Runtime要求时间时允许更高的精度。 即纳秒精度

    `Nanotime`库主要解决了Java原生API在获取当前时间时精度不足的问题。在Java中,`System.currentTimeMillis()`返回的是自1970年1月1日00:00:00 GMT以来的毫秒数,而`nanoTime()`方法虽然返回的是自某个不确定的起点...

    java翻纸牌游戏-fanpai.rar

    同时,游戏会统计翻牌成功的时间,这需要用到计时器和时间处理函数,例如Java的`System.nanoTime()`。 在实际的代码实现中,良好的编程习惯如代码注释、异常处理、模块化设计等也非常重要。此外,为了确保游戏的可...

    算法性能比较[java版]

    在Java中,可以使用System.nanoTime()来获取精确的计时信息。此外,使用JMH(Java Microbenchmark Harness)这样的专业工具可以获得更可靠和可重复的测试结果。 在实际应用中,理解并优化这些性能指标对于提升代码...

    java使用栈进行压栈和弹出操作

    在Java编程语言中,栈是一种基于“后进先出”(LIFO)原则的数据结构,常用于实现递归、表达式求值、内存管理等多种功能。在这个特定的场景中,我们利用栈来模拟数据的压入和弹出操作,以评估性能。下面将详细介绍...

    miaobiao.rar_java 秒表

    在Java中,我们可以使用内置的`System.currentTimeMillis()`或`System.nanoTime()`方法来创建一个简单的秒表功能。本项目名为“miaobiao.rar”,提供了一个用于学习的Java秒表程序,该程序不仅实现了基本的计时功能...

    java _swing_stop_watch.zip_horncaj_java_watch

    为了实现精确计时,开发者可能会使用System.nanoTime()或System.currentTimeMillis()方法。前者提供纳秒级精度,但并不总是与实际时间线性关联,后者则返回自系统启动以来的毫秒数,更适用于大多数计时需求。 标签...

    [Java典型应用彻查1000例:图形与网络游戏开发]

    ### Java典型应用彻查1000例:图形与网络游戏开发 #### 一、引言 随着技术的发展,Java 在图形界面和游戏开发领域扮演着越来越重要的角色。本篇文章将根据《Java典型应用彻查1000例:图形与网络游戏开发》这本书中...

Global site tag (gtag.js) - Google Analytics