`
hold_on
  • 浏览: 455669 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

System.nanoTime() 的隐患

阅读更多

      前段时间项目中需要 统计接口连接时间,考虑到连接时间一般都是零点几毫秒级别的,为了拿到更精确地数值,没有使用System.currentTimeMillis(),而是贸然地使用System.nanoTime()来统计时间,后来分析服务器上的数据,发现 竟然有10-15%的数据数值竟然超过了 10的13次方。

     原因:

System.currentTimeMillis() 起始时间是基于 1970.1.1 0:00:00 这个确定的时间的,而System.nanoTime()是基于cpu核心的时钟周期来计时,它的开始时间是不确定的。(有篇文章说是更加cpu核心的启动时间开始计算的)

但是在多核处理器上,由于每个核心的开始时间不确定,但是在多核处理器上,

	long start = System.nanoTime();
		String ip = Utilities.getIpByUrl(url);
		long cost = System.nanoTime() - start;

 

 这段代码有可能会运行在两个不同的cpu核心上,从而导致得到的结果完全不符逻辑。

 

Returns the current timestamp of the most precise timer available on the local system, in nanoseconds. Equivalent to Linux's CLOCK_MONOTONIC.

This timestamp should only be used to measure a duration by comparing it against another timestamp from the same process on the same device. Values returned by this method do not have a defined correspondence to wall clock times; the zero value is typically whenever the device last booted. Use currentTimeMillis() if you want to know what time it is. 

     

0
0
分享到:
评论
7 楼 yhxf_ie 2018-07-24  
zhangnanw 写道
亲,这不是纳秒时间的隐患,是作者用错了地方。

统计接口连接时间长度, 怎么用错了地方?
6 楼 zhangnanw 2015-11-27  
亲,这不是纳秒时间的隐患,是作者用错了地方。
5 楼 somatezyc 2015-10-22  
楼主,我是用System.currentTimeMillis()计算差值出现过错误的情况,当时是因为调整时钟导致的。所以使用这个也是不对的。
4 楼 hold_on 2014-03-13  
liang86 写道
System.currentTimeMillis() 起始时间是基于 1970.1.1 0:00:00 这个确定的时间的.

为什么两个时间相减,会不正确呢?


应该是System.nanoTime(),已更正,谢谢提醒
3 楼 liang86 2014-03-12  
System.currentTimeMillis() 起始时间是基于 1970.1.1 0:00:00 这个确定的时间的.

为什么两个时间相减,会不正确呢?
2 楼 TeacherMao 2013-09-18  
又仔细阅读了一下在1楼引用的文章,发现在intel平台上win xp sp2之前以及在linux 2.6.18之前都是有问题的,之后应该都修好了。基本上说,nanoTime更依赖于cpu的设计和操作系统在这个级别上的时间函数的实现,所以谨慎对待还是很有必要的。
1 楼 TeacherMao 2013-09-17  
这篇文章有点儿耸人听闻,希望楼主可以给出确实的可验证的例子。

我特地查了一些资料,看到了这篇文章:http://stackoverflow.com/questions/510462/is-system-nanotime-completely-useless

从这篇文章的答案中看,你说的很可能是个误解。当然如果你有一个在多核下面很容易复制的样例,比什么理论都有说服力。期待楼主的跟进。

相关推荐

    android时间戳总结:System.nanoTime(),System.currentTimeMillis(),SystemClock

    System.nanoTime() System.currentTimeMillis() SystemClock.uptimeMillis() SystemClock.elapsedRealtime() SystemClock.currentThreadTimeMillis 0、时间的单位: 秒:second 毫秒:Millisecond 微妙:Microsecond...

    System.currentTimeMillis() 和 System.nanoTime() 哪个更快?大

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    JAVA版本标准纳秒实现

    2、解决System.nanoTime();并不代表实际时间纳秒的问题。 3、解决解决System.nanoTime();不同JVM获取值不一致的问题。 4、解决解决System.nanoTime();值无法与毫秒时间换算问题。 5、可与GO的纳秒时间兼容。

    Java中获取比毫秒更精确的时间.docx

    为了解决 `System.currentTimeMillis()` 的局限性,Java 提供了 `System.nanoTime()` 方法来获取比毫秒更精确的时间。该方法返回自某个固定点以来的纳秒数,通常用于测量时间差,而不是绝对时间。需要注意的是,虽然...

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

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

    java 记录程序执行的时间

    `System.currentTimeMillis()`适合简单场景,`System.nanoTime()`与`TimeUnit`组合提供更高精度,而第三方库如Guava的`Stopwatch`则提供了更友好的API。对于性能敏感的代码,推荐使用专业的性能测试工具和框架进行...

    十分有用的java小结

    System.nanoTime() 函数用来返回最准确的可用系统计时器的当前值,以毫微秒为单位。例如: ```java long startTime = System.nanoTime(); // ... 代码被测量 ... long estimatedTime = System.nanoTime() - ...

    java程序_秒表

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

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

    在Java中,`System.currentTimeMillis()`返回的是自1970年1月1日00:00:00 GMT以来的毫秒数,而`nanoTime()`方法虽然返回的是自某个不确定的起点以来的纳秒数,但这个值并不适合直接用来计算时间差,因为它并不与`...

    测试时间的算法

    总结起来,Java提供了多种工具和方法来测试代码的执行时间,包括`System.currentTimeMillis()`、`System.nanoTime()`、`TimeUnit`以及`Thread.sleep()`等。开发者可以根据具体需求选择合适的方式,对代码进行性能...

    miaobiao.rar_java 秒表

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

    Stopwatch:秒表应用程序-线程

    在Java中,我们可以使用内置的`java.util.concurrent.TimeUnit`类和`java.lang.System.nanoTime()`方法来创建一个简单的秒表功能。下面将详细讨论如何实现这样的秒表应用程序以及与线程相关的知识。 首先,`...

    Java计算程序代码执行时间的方法小结

    Java 计算程序代码执行时间的方法可以使用 System.currentTimeMillis() 方法和 System.nanoTime() 方法来记录程序的开始和结束时间,从而计算出程序的执行时间。这些方法对于排查性能问题、优化代码执行效率和 debug...

    用java编写的计时器

    根据提供的代码片段,我们可以看到三种不同的计时器实现方法:使用`java.util.Date`、`System.currentTimeMillis()`以及`System.nanoTime()`。下面将分别介绍这三种方法的特点和应用场景。 #### 三、使用`java.util...

    java计时器

    Java 8引入了`System.nanoTime()`方法,它可以提供纳秒级别的计时,相比`System.currentTimeMillis()`更加精确。 ```java public long startTime = System.nanoTime(); // 执行待测代码 public long endTime = ...

    System Lambda是一个函数集合,用于测试使用javalangSystem的代码.zip

    System Lambda 是一个专门为测试涉及 `java.lang.System` 类的代码而设计的工具集。`java.lang.System` 是Java标准库中的一个核心类,它提供了一系列静态方法,用于系统级的操作,如获取系统属性、标准输入/输出流...

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

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

    性能监控工具类(StopWatchUtil)

    在Java中,我们可以使用System.nanoTime()方法获取纳秒级别的精确时间,从而计算出精确的执行时间。这个工具类可能会包含以下关键方法: 1. `start()`: 开始计时,通常会记录当前时间作为起始时间。 2. `stop()`: ...

    Stopwatch

    然而,对于简单的计时操作,我们通常不需要这么复杂的结构,因此 `System.nanoTime()` 或 `System.currentTimeMillis()` 函数更为常用。 ### 二、使用 `System.nanoTime()` 实现 Stopwatch 由于 Kotlin 标准库中并...

Global site tag (gtag.js) - Google Analytics