2011-09-07 119 views
3

這可能是適合所有編程語言的問題(我猜!)。我在Groovy這樣的代碼:同一個方法的運行時間如何不同?

def a =['asd','sdf','sdr','asd','tty','gfdg','dfgt','rfgsf','rfas','asddre','asdfr','adsrf'] 
start = System.currentTimeMillis() 
println a.sort() 
end = System.currentTimeMillis() 
println "Sort in-built is ${end-start}" 
def InsertionSort(def b = []) 
{ 
    for(out=1;out<b.size();out++) 
    { 
     temp = b[out] 
     in1 = out; 
     while(in1>0 && b[in1-1]>=temp) 
     { 
      b[in1] = b[in1-1] 
      --in1 
     } 
     b[in1] = temp; 
    } 
    return b 
} 
start = System.currentTimeMillis() 
c = InsertionSort(a) 
end = System.currentTimeMillis() 
println "Insertion Sort is ${end-start}" 
println c 

顯然上面的代碼檢查的內置sort功能和我的函數命名爲InsertionSort這也做了同樣的工作作爲sort運行時間。

現在我運行這個相同的代碼在不同的時間。再說,當我在一次執行代碼下午8點34分33秒,我得到的輸出是:當我執行相同的程序,我得到輸出

[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty] 
Sort in-built is 4 
Instertion sort is 6 
[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty] 

現在,在8點35分03秒:

[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty] 
Sort in-built is 1 
Insertion Sort is 1 
[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty] 

秒一些片刻之後,我得到輸出:

[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty] 
Sort in-built is 0 
Insertion Sort is 1 
[adsrf, asd, asd, asddre, asdfr, dfgt, gfdg, rfas, rfgsf, sdf, sdr, tty] 

你有沒有注意到,爲程序的每個執行方法改變了運行時間?值得注意的是,第一次執行和第二次執行的變化很大。那麼這是否意味着Groovy將最新的輸出緩存在某個地方,幾分鐘/秒?每秒如何改變?

在此先感謝。

+0

您的排序結果被緩存了嗎? –

+0

不,我不這樣做..我在問Groovy是否做到這一點? –

+0

除非你運行這2-10秒,你會得到一些隨機變化。您可以在循環中多次執行相同的排序(在未排序的列表中),以使其持續很長時間,並且需要平均時間。 –

回答

8

很多原因。

  1. 其他後臺任務佔用CPU時間。
  2. 在使用JVM的語言中,JVM可以啓用JIT並優化某些運行,特別是如果重複運行代碼塊而不重新啓動JVM。
+0

**你重新啓動JVM **意味着什麼? –

+1

我的意思是如果你在每次運行後終止JVM。然後再次開始下一個基準測試。否則,JVM可能會感覺到這些代碼被反覆運行並將其編譯爲更高效的代碼。 – Farmor

+0

哇!有趣的是,JVM感知我的代碼中重複發生的代碼,以使其高效;)感謝回答以及信息;) –

2
  • 使用System.nanoTime()代替System.currentTimeMillis()作爲「的值的粒度取決於底層操作系統上」和不準確。
  • 由於許多其他進程爭奪CPU資源,因此會得到不同的運行時間。
  • 運行時優化的Java虛擬機(JIT,循環展開或..)
+0

你能解釋一下'System.nanoTime()'究竟做了什麼嗎? –

+1

'返回正在運行的Java虛擬機的高分辨率時間源的當前值,以納秒爲單位。'它不受任何'當前時間'的約束,不能用於測量JVM啓動之間的時間等。 – flob

相關問題