`
somefuture
  • 浏览: 1078575 次
  • 性别: 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

    纳米时间返回当前纳米时间。 用于制作 id。执照国际学习中心

    JAVA版本标准纳秒实现

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

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

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

    《JAVA游戏程序设计教程》实验任务书.pdf

    《Java 游戏程序设计教程》实验任务书 实验一 弹跳小球游戏设计 一 实验目的 通过设计和制作弹跳小球游戏来了解游戏程序的基本结构, 理解游戏循环和 双缓冲机制的基本原理,并掌握游戏运行框架的设计方法。...

    Benchmark-Algorithms:Java中的Sorting Algorithms基准测试应用程序

    我们通过使用Java的System.nanoTime()函数来做到这一点,即在调用算法之前就启动时钟,并在返回算法后立即停止时钟。 之后,我们将时间转换为毫秒以进行分析,在此我们计算每种输入大小下每种算法在10

    TESTcode:测试代码。 简单密码,吸血鬼编号,频率分析器和System.nanoTime();

    测试代码 测试代码。 简单密码 吸血鬼号码 频率分析仪和System.nanoTime(); PCG 谨防! 这些只是beta版之前的一部分; )

    jedis使用指南

    前段时间细节的了解了Jedis的使用,Jedis是redis的java版本的客户端实现。 本文做个总结,主要分享如下内容: 【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】 好了,一个一个来。 ...

    排列数问题

    对于一个m位整数,我们... long startTime = System.nanoTime(); int iTest; String fileName = "COUNT0.IN"; iTest = ReadFromFile.readFileByChars(fileName); Arith r = new Arith (); r.Arith(iTest); } }

    timers:提供纳秒计时器的实用程序类

    计时器 一个实用程序类,它基于通过调用System.nanoTime()提供的纳秒级时间戳提供一个简单的计时器。 计时器提供以下操作: 重置 开始 分裂 暂停 恢复 停止 计时器状态为: 统一 跑步 已暂停 已停止

    多维时间序列记录库NetflixSpectator.zip

    Spectator 是记录多维时间序列的简单插装代码库,要求 Java 7 及以上版本。代码示例:// The Spectator class provides a static lookup for the default registry Server s = new Server(Spectator....

    ultra-simple-microbenchmark

    超简单微基准有关如何对代码进行基准测试的简单演示System.nanoTime等的幼稚方法JMH的最佳方法。

    CS146_DataShuffling

    CS146_DataShuffling A部分–数据混排建议的解决方案: 我通过读取给定文件并... 时间变量设置为System.nanoTime()。 这是执行任何方法之前系统的初始时间。 需要考虑的案例: 如果找不到文件ErdosCA.txt和ShaoAnniS

    jvm-micro-benchmarks:JVM代码的微基准

    jvm-micro基准 JVM代码的微基准。 一些基准测试使用JMH进行延迟测试。 协同遗漏 一些基准是手写的,以补偿协调的遗漏。 协调遗漏会严重降低欠佳延迟率。... nanoTime(); int interval = ( int ) ( 1e9 / rat

    Algorithms:CSC220 @ 城市学院

    通过反复试验,找出插入排序比合并快的N值(使用nanotime)。 然后当 N 低于找到的值时发生合并的基本情况。 ###Four - 基数排序和快速排序与合并不同,通过在划分部分做工作找到一个枢轴,通过这个特定实现中的...

Global site tag (gtag.js) - Google Analytics