1.7 以納秒級的時(shí)間計(jì)算:使用System.nanoTime
Java5+
摩爾定律是一種眾所周知的現(xiàn)象,即計(jì)算機(jī)中的晶體管數(shù)量和它的處理速度隨時(shí)間呈指數(shù)規(guī)律增長。作為仙童半導(dǎo)體公司(Fairchild Semiconductor)的研發(fā)領(lǐng)導(dǎo)人,戈登•摩爾于1965年提出了這一偉大發(fā)現(xiàn)。迄今為止,它仍有效。
與Java首次出現(xiàn)的時(shí)候相比,當(dāng)前計(jì)算機(jī)的速度要快得多,對于很多應(yīng)用程序而言以毫秒計(jì)時(shí)已不再能夠滿足要求。你可能使用過java.lang.System類,利用currentTimeMillis方法來獲得一個(gè)方法調(diào)用或一段代碼的定時(shí)信息。此方法可以用來度量執(zhí)行某操作所花費(fèi)的時(shí)間。但是,在運(yùn)算速度更快的計(jì)算機(jī)上操作花費(fèi)的時(shí)間可能遠(yuǎn)小于1毫秒,于是可以在一個(gè)for循環(huán)中執(zhí)行此操作上百次或上千次,然后除以循環(huán)次數(shù)來計(jì)算此操作的單位時(shí)間??紤]下面的示例:
long startTime = System.currentTimeMillis(); |
這種一種很簡單的運(yùn)算,因?yàn)槭褂昧薴or循環(huán)1000次。但是如果要度量亞微秒該如何實(shí)現(xiàn)呢?
for(int i=0; i<1000000; i++) { performOperation(); } |
List myList = initializeList(); // initialize the List somehow |
遺憾的是,運(yùn)行上面的代碼時(shí)無法保證實(shí)際上獲得的是納秒級的度量。但是使用更快的機(jī)器和良好的JRE實(shí)現(xiàn),對于測試目的而言它是一種有用的度量方法??梢栽贘DK 5文檔中找到更多有關(guān)此方法的信息。鑒于操作系統(tǒng)特性、機(jī)器處理速度和系統(tǒng)負(fù)載的不同,得到的由nanoTime方法返回的值可能會(huì)有很大的變化。隨著時(shí)間的推移此問題應(yīng)該會(huì)有所改善,摩爾定律基本上能保證這一點(diǎn)。
參考資料:
想要了解摩爾的原始論文,請參看Gordon E. Moore, Cramming More Components onto Integrated Circuits, Electronics, Vol. 38, No. 8 (April 19, 1965)。此外,還可以在網(wǎng)上獲得該論文,參看本書的網(wǎng)站http:// wickedcooljava.com以獲得URL。