`
woshixushigang
  • 浏览: 578630 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

System.nanoTime;

 
阅读更多

Java5+

摩尔定律是一种众所周知的现象,即计算机中的晶体管数量和它的处理速度随时间呈指数规律增长。作为仙童半导体公司(Fairchild Semiconductor)的研发领导人,戈登•摩尔于1965年提出了这一伟大发现。迄今为止,它仍有效。
与Java首次出现的时候相比,当前计算机的速度要快得多,对于很多应用程序而言以毫秒计时已不再能够满足要求。你可能使用过java.lang.System类,利用currentTimeMillis方法来获得一个方法调用或一段代码的定时信息。此方法可以用来度量执行某操作所花费的时间。但是,在运算速度更快的计算机上操作花费的时间可能远小于1毫秒,于是可以在一个for循环中执行此操作上百次或上千次,然后除以循环次数来计算此操作的单位时间。考虑下面的示例:

long startTime = System.currentTimeMillis();
for (int i=0; i<1000; i++) {
performOperation(); // something we want to measure
}
long endTime = System.currentTimeMillis();
long totalTimeInMillis = endTime - startTime;
// because the count was 1000, it's easy to get the unit time
long unitTimeInMicros = totalTimeInMillis;

这种一种很简单的运算,因为使用了for循环1000次。但是如果要度量亚微秒该如何实现呢?

for(int i=0; i<1000000; i++) { performOperation(); }

如果从人类的角度来看,可怜的for循环将不得不不厌其烦地百万次的频繁循环!此外,只有在重复执行操作没有副作用的情况下使用for循环来计算时间才是有用的。如果操作是调用java.util.Collections.sort方法,那么将很难计算出排序过程花费的时间。在Java 5中,System类有一个新的nanoTime方法,它能返回一个纳秒精度的计数器。尽管不能将它用于度量绝对时间,但是它能够很好地度量时间差别。

List myList = initializeList();  // initialize the List somehow
long startTime = System.nanoTime();
Collections.sort(myList);         // measuring the sort time
long endTime = System.nanoTime();
long differenceInNanoseconds = endTime - startTime;

遗憾的是,运行上面的代码时无法保证实际上获得的是纳秒级的度量。但是使用更快的机器和良好的JRE实现,对于测试目的而言它是一种有用的度量方法。可以在JDK 5文档中找到更多有关此方法的信息。鉴于操作系统特性、机器处理速度和系统负载的不同,得到的由nanoTime方法返回的值可能会有很大的变化。随着时间的推移此问题应该会有所改善,摩尔定律基本上能保证这一点。

参考资料:

想要了解摩尔的原始论文,请参看Gordon E. Moore, Cramming More Components onto Integrated Circuits, Electronics, Vol. 38, No. 8 (April 19, 1965)。此外,还可以在网上获得该论文,参看本书的网站http:// wickedcooljava.com以获得URL。

分享到:
评论

相关推荐

    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的纳秒时间兼容。

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

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

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

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

    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()`方法返回...

    测试时间的算法

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

    miaobiao.rar_java 秒表

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

    用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

    3. **系统时间(System.currentTimeMillis(), System.nanoTime())**:在某些测试中,需要固定或者精确控制时间。System Lambda 可以提供预设的时间值,避免因为系统时间的变化导致测试结果不一致。 4. **安全退出...

    性能监控工具类(StopWatchUtil)

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

    jedis使用指南

    while ((System.nanoTime() - nano) ) { if (jedis.setnx(key, LOCKED) == 1) { jedis.expire(key, EXPIRE); locked = true; return locked; } // 短暂休眠,nano避免出现活锁 Thread.sleep(3, r.nextInt...

    JVM Mechanics

    long startTime = System.nanoTime(); for (int j = 0; j ; ++j) { new Object(); } long endTime = System.nanoTime(); System.out.printf("%d\t%d%n", i, endTime - startTime); } } } ``` 从性能图表中...

    多线程训练营资料2.xls.md

    System.out.println((System.nanoTime() - start) / 100_0000); } } ``` 在这个示例中,我们使用了缓存行填充技术(Cache Line Padding),即在类`T`中添加了7个`volatile long`字段来避免伪共享。通过这种方式,...

    运行时间计算

    在Java中,可以使用`System.nanoTime()`函数来获取纳秒级别的运行时间: ```java public class Main { public static void main(String[] args) { long startTime = System.nanoTime(); // 你的程序代码在这里 ...

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

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

    Stopwatch:秒表应用程序-线程

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

Global site tag (gtag.js) - Google Analytics