2016-11-22 42 views
0

比方說,我有以下的for循環,我想時間:測量花費執行代碼的時間

for(int i = 0; i < list.size() - 1; i++) {  
{ 
// call other methods, let's say call other 3-4 methods 

} 

所以,如果我想衡量for循環需要與一個運行在多少時間在for循環之前和之後構建Java long time = System.nanoTime();,它是否也會測量我要調用的方法內部花費的時間?

或者,如果我不調用其他方法,只是將所有代碼放在我的for循環中,它會花費更多的時間比如果我只是調用其他方法?

+0

花費在循環中的時間取決於花費在其中的方法的時間......所以問題是什麼? – AxelH

+1

可能的重複[如何在Java中編寫正確的微基準測試?](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java ) – rkosegi

回答

1

計時器只計算它開始和結束的時間差。它不知道在開始和結束之間發生了什麼。因此,如果將所有代碼轉儲到for循環中,或者直接調用這些方法而不是內聯它們都無關緊要。

但是,這不會給你每個單獨功能所花費的時間。您可能需要查看Java profilers以更系統的方式獲得結果。

0

System.nanoTime()返回正在運行的Java虛擬機的高分辨率時間源的當前值,以納秒爲單位。

從Java的文檔:

此方法只能用於測量經過的時間,而不是 相關的系統或掛鐘時間任何其他想法。返回的值 表示自一些固定但任意的起點 時間(可能在未來,因此值可能爲負)後的納秒。該方法的所有調用在 Java虛擬機的實例中都使用相同的 源;其他虛擬機實例可能會使用不同的來源。

通過使用System.nanoTime()值計算時間將計算執行該循環所用的全部時間。這將包括循環內方法的執行時間(如果它們在那裏的話)。但是,如果它發生在循環內有自己的執行時間的線程,從點1到點2所經過的時間只會是啓動線程所花費的時間,而不是其執行時間。


我發現瞭解這件事的好方法。只要寫一個簡單的代碼:

long t1 = System.nanoTime(); 
long t2 = System.nanoTime(); 
System.out.println((t2 - t1)/1000000); 
  1. 在調試器拉這個,看看當你不適用任何斷點會發生什麼。

  2. 現在在#2行應用一個斷點並在恢復執行前等待一段時間。

您可以看到區別。


Reference Link

+0

線程的好處!但是你可以等他們停止後,你已經全部運行;) – AxelH

+0

@AxelH只是分享我的經驗/知道;)也將包括。 – Jay

+0

@AxelH對不起,我沒有得到你所說的:/ – Jay

0

這裏是什麼,我會用做一些基本的,而不是精確的測試一個簡單的例子。

首先,我們需要一些基本的方法來啓動和打印時容易

public class Main { 

    static long start; 

    static void startTest(){ 
     start = System.nanoTime(); 
    } 

    static void stopTest(){ 
     System.out.format("%012.6f ms\n",(System.nanoTime() - start)/1000000.0); 
     start = -1; 
    } 
} 

單線程

讓我們運行在一個空的循環測試:

startTest(); 
for(int i = 0; i < Integer.MAX_VALUE; ++i){} 
stopTest(); 

這將等待該在調用stopTest()之前循環結束並打印所需的時間。

多線程

隨着不同的線程,你需要等待,他們結束,這是簡單,也可以不以多種方式。這裏是一個:

startTest(); 
List<Callable<String>> list = new ArrayList(); 
for(int i=0;i<5;i++){ 
    list.add(new Callable() { 
     public Object call() throws Exception { 
      for(int i = 0; i < Integer.MAX_VALUE/5; ++i){} 
      System.out.println("End of Thread"); 
      return null; 
     } 
    }); 
} 
ExecutorService es = Executors.newCachedThreadPool(); 
try { 

    es.invokeAll(list); 
} catch (InterruptedException ex) { 
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
} finally { 
    stopTest(); 
    es.shutdown(); 
} 

有了這個Executors,我們可以在同一時間等待他們結束調用所有Callable