有沒有什麼方法可以知道在java中執行循環需要多少秒?執行循環需要多長時間?
例如:
for(int i=0; i < 1000000; i++) {
//Do some difficult task goes in here
}
它不必是準確的100%,但它只是有可能需要多久的想法。裏面的算法是寫入.txt文件的某種密鑰生成器。我期望它甚至需要幾分鐘,所以對於我的第一次測試,我想計算秒數。
有沒有什麼方法可以知道在java中執行循環需要多少秒?執行循環需要多長時間?
例如:
for(int i=0; i < 1000000; i++) {
//Do some difficult task goes in here
}
它不必是準確的100%,但它只是有可能需要多久的想法。裏面的算法是寫入.txt文件的某種密鑰生成器。我期望它甚至需要幾分鐘,所以對於我的第一次測試,我想計算秒數。
在這裏,您可以試試這個:
long startTime = System.currentTimeMillis();
long endTime = 0;
for(int i=0; i < 1000000; i++) {
//Something
}
endTime = System.currentTimeMillis();
long timeneeded = ((startTime - endTime) /1000);
@Michael Parker:嘗試'System.nanoTime();' – 2011-06-05 15:24:17
請注意,這種過分簡單的方法會給出誤導性的答案。 – 2011-06-05 15:26:00
爲什麼給0分配'endTime'? – 2011-06-05 15:59:47
這取決於循環內的操作,所以你應該做的是記錄循環的開始時間和循環的結束時間,然後計算差異。你會得到循環完成的時間。例如: -
long st = System.currentTimeMillis();
for(int i=0; i < 1000000; i++) {
// --- loop operation
}
System.out.print("time to execute loop"+
((st - System.currentTimeMillis()) /1000));
請注意,這種過分簡單的方法可能會導致誤導性答案。 – 2011-06-05 15:26:06
除非時間倒退(當您調整時鐘時可能發生),您的時間將全部爲負數。 – 2011-06-05 18:46:43
你用Java編寫微基準測試時需要非常小心。例如:
如果JIT編譯器能夠發現循環體不影響代碼的結果,它可以優化它。例如:
for (int i = 0; i < 1000000; i++) {
int j = i + 1;
}
很可能「跑」得非常快。
代碼在JIT編譯後運行得更快。
代碼可以出現運行速度變慢了很多而它正在JIT編譯。
如果代碼分配對象,則需要考慮GC運行導致的測量性能的潛在可變性,初始堆棧大小或最大堆大小等。
當然,性能取決於您的硬件,操作系統,JVM的版本和補丁級別以及JVM啓動選項。
+1:當你有一個長循環並沒有做任何事情時,你實際上計時需要多長時間才能確定循環沒有做任何事情。 ;) – 2011-06-05 18:45:33
定時操作的一種方法是使用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微秒。
這完全取決於所用機器的種類。您需要對其進行基準測試。 – 2011-06-05 15:05:33
將代碼添加到基準測試中會爲您的循環添加額外的步驟,從而使您的基準測試不準確。 – 2017-06-27 18:14:09