2013-03-17 76 views
1

我已經創建了一個新的冒泡排序項目,我想知道它需要多少時間。因此,我添加了一個getTime()方法,該方法返回nanotime。我也創建了一個具有9個靜態值的數組。當我運行我的代碼時,我得到不同的運行時間(即:通常我得到3849 ns,但有時6432或4277 ns)。怎麼會這樣?我在Java中獲得bubblesort的不同運行時間

我的代碼如下:

long time2; 
public void sort(int[] dizi){ 
    long time = System.nanoTime(); 
    for (int i = dizi.length-1; i >0; i--) { 
     for (int j = 0; j < i; j++) { 
      if(dizi[j]>dizi[j+1]){ 
       super.swap(dizi, j, j+1); 
      } 
     } 
    } 
    time2 = System.nanoTime() - time; 
} 
public long getTime(long time){ 
     return time; 
} 
main(){ 
     BubbleSort bubbleSort = new BubbleSort(); 
     int[] arr = {4,2,1,8,9,5,3,7,6}; 
     bubbleSort.sort(arr); 
     Sysout(bubbleSort.getTime(time2)); 
} 
+4

可以有很多的變數,可能會導致你的時間是不同的,如JVM進行垃圾收集,您的操作系統執行一些其他任務等。 – blamonet 2013-03-17 23:49:12

+1

展開您的陣列到10萬以上。 – yehe 2013-03-17 23:53:22

+0

復活節兔:什麼都沒有改變,我的第一次審判13204534055秒13230923476 blamonet:如果我看到真實的)這種情況與我的系統和System.nanoTime(正常的異常 – 2013-03-18 00:00:15

回答

0

有多種因素可能會影響結果。

JVM可能會開始運行垃圾回收(這絕對不是你的情況),在運行你的程序時,JVM可能會分配一些內存,而底層的OS服務發現它應該交換一些內存,因爲它已經用完了可用的RAM, etc ...

沒有可用的JVM(適用於Mac,Windows和Linux/Unix)在實時系統上運行,但即使有一天它會執行 - 您的JVM可能會決定您的程序的優先級低於某些JVM活動。

嘗試一些啤酒陣,結果將更加穩定。

0

除非你正在運行的硬件可以準確地測量納秒(提示 - 它不能),沒有辦法對Java給你一個準確的時間戳以ns計。

最重要的是,Java是不確定性的方面運行的代碼的時間。在任何時候,您的代碼都可能被JVM正在運行的大量其他內務管理任務中斷,最顯着的是垃圾收集。

還有熱點編譯器,它將識別一段經常運行的字節代碼,並且會立即將其重新編譯爲本地代碼,這會導致暫停,但隨後的運行性能會得到改善。如果您想從公式中移除熱點效應,您需要通過運行代碼幾萬次以確保代碼被編譯爲本機代碼來測試代碼,然後執行實際的定時運行以查看代碼的效率如何。

您所看到的最終結果是,代碼可以運行多次,產生相同的結果,但需要不同的時間來返回該結果,而且對於任何地方的OCD編碼器來說,壞消息都是您永遠不會做出來的每次測試運行的數量都相同。對於像這樣的性能測試,我通常希望運行代碼的次數可能是1,000次,並記錄最快時間,最慢時間,平均時間和標準偏差,以便準確瞭解特定作品的運行時間的代碼。如果我收到意想不到的緩慢運行,然後在虛擬機上啓用詳細的GC選項時,我會在日誌中查找完整的GC事件。

哦,不要忘記你的JVM上運行的操作系統是運行時提供一個可變量過多時,OS看家TAKS實在是太運行。