首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.7  以纳秒级的时间计算:使用System.nanoTime

摩尔定律是一种众所周知的现象,即计算机中的晶体管数量和它的处理速度随时间呈指数规律增长。作为仙童半导体公司(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。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论