1.7 以納秒級的時間計算:使用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。