2011-06-05 149 views
6

有沒有什麼方法可以知道在java中執行循環需要多少秒?執行循環需要多長時間?

例如:

for(int i=0; i < 1000000; i++) { 

//Do some difficult task goes in here 

} 

它不必是準確的100%,但它只是有可能需要多久的想法。裏面的算法是寫入.txt文件的某種密鑰生成器。我期望它甚至需要幾分鐘,所以對於我的第一次測試,我想計算秒數。

+0

這完全取決於所用機器的種類。您需要對其進行基準測試。 – 2011-06-05 15:05:33

+0

將代碼添加到基準測試中會爲您的循環添加額外的步驟,從而使您的基準測試不準確。 – 2017-06-27 18:14:09

回答

8

在這裏,您可以試試這個:

long startTime = System.currentTimeMillis(); 
long endTime = 0; 

    for(int i=0; i < 1000000; i++) { 

    //Something 

    } 

endTime = System.currentTimeMillis(); 

long timeneeded = ((startTime - endTime) /1000); 
+1

@Michael Parker:嘗試'System.nanoTime();' – 2011-06-05 15:24:17

+0

請注意,這種過分簡單的方法會給出誤導性的答案。 – 2011-06-05 15:26:00

+1

爲什麼給0分配'endTime'? – 2011-06-05 15:59:47

1

這取決於循環內的操作,所以你應該做的是記錄循環的開始時間和循環的結束時間,然後計算差異。你會得到循環完成的時間。例如: -

long st = System.currentTimeMillis(); 

for(int i=0; i < 1000000; i++) { 
    // --- loop operation 
} 

System.out.print("time to execute loop"+ 
        ((st - System.currentTimeMillis()) /1000)); 
+0

請注意,這種過分簡單的方法可能會導致誤導性答案。 – 2011-06-05 15:26:06

+0

除非時間倒退(當您調整時鐘時可能發生),您的時間將全部爲負數。 – 2011-06-05 18:46:43

11

你用Java編寫微基準測試時需要非常小心。例如:

  • 如果JIT編譯器能夠發現循環體不影響代碼的結果,它可以優化它。例如:

    for (int i = 0; i < 1000000; i++) { 
        int j = i + 1; 
    } 
    

    很可能「跑」得非常快。

  • 代碼在JIT編譯後運行得更快。

  • 代碼可以出現運行速度變慢了很多它正在JIT編譯。

  • 如果代碼分配對象,則需要考慮GC運行導致的測量性能的潛在可變性,初始堆棧大小或最大堆大小等。

當然,性能取決於您的硬件,操作系統,JVM的版本和補丁級別以及JVM啓動選項。

+2

+1:當你有一個長循環並沒有做任何事情時,你實際上計時需要多長時間才能確定循環沒有做任何事情。 ;) – 2011-06-05 18:45:33

2

定時操作的一種方法是使用nanoTime()函數取平均值您可能需要調整迭代次數,並且平均值變化較小。 nanoTime比的currentTimeMillis更好,因爲它是更準確和單調遞增(應用程序運行時就不會走回頭路)

long start = System.nanoTime(); 
int runs = 1000*1000; 
for(int i=0;i<runs;i++) { 
    // do test 
} 
long time = System.nanoTime() - start; 
System.out.printf("The average time taken was %.1f ns%n", (double) time/runs); 

用printf允許你格式化的結果。你可以用1000除以微秒或1000000微秒。