2016-08-25 238 views
0

我想時間在我的應用程序中花費多長時間,問題是時間總是顯示0秒。我的代碼在下面有什麼問題?計時方法持續時間:始終顯示零秒?

long currentTimeInMilis = System.currentTimeMillis() % 1000; 

    public ClassName() { 

     public void timeMethod() { 

       long startOfmethod= currentTimeInMilis; 

       methodToTime(); 

       long endOfMethod= currentTimeInMilis; 

       long totalTime = endOfMethod= - startOfmethod; 

       LOGGER.info("[Method Took: {}", DurationFormatUtils.formatDuration(totalTime, "H:mm:ss", true) + "]\n");            
      } 
    } 

的問題是,我每次得到這個輸出沉綿我知道它正在大於零秒:

Method took: 0:0:0: 
+0

您是否知道這樣的執行速度有多快? – Stultuske

+0

是的,它應該至少需要2分鐘 – java123999

+1

設置'long endOfMethod = System.currentTimeMillis()'而不是'long endOfMethod = currentTimeInMilis' –

回答

4

您使用的是相同的currentTimeInMilis變量之前和之後。這並不像是在此期間神奇地改變了它(當然,除非methodToTime這樣做,因爲你已經將它變成了一個場而不是局部變量)。您必須在方法完成後再次調用調用System.currentTimeMillis()以獲得可以與調用方法之前的值比較的值。

例如,擺脫currentTimeInMilis場的全部,並請參閱下面***

public ClassName() { 

    public void timeMethod() { 

     long startOfmethod = System.currentTimeMillis(); // *** 

     methodToTime(); 

     long endOfMethod = System.currentTimeMillis(); // *** 

     long totalTime = endOfMethod = -startOfmethod; 

     LOGGER.info("[Method Took: {}", DurationFormatUtils.formatDuration(totalTime, "H:mm:ss", true) + "]\n"); 
    } 
} 

請注意,我已經刪除了% 1000爲好;僅記住該值的毫秒部分是沒有意義的。

但是,請注意,這隻適用於非常非常粗略的指示(您說這個方法需要兩分鐘)。有關適當的基準測試,請參見How do I write a correct micro-benchmark in Java?

+0

謝謝,這已經解決了它,我會接受,這比正確的微型標記準確得多嗎? – java123999

+0

@ java123999:查看問題及其答案。以上將以合理的精度和準確度告訴你,**給'methodToTime'所花費的時間**。但是,這並不意味着另一個調用會花費那麼長時間,或者平均需要這麼長時間,或者負載很低,或者...... JVM會進行大量即時優化;一個只需運行一次就需要一秒運行的方法,如果它在緊密的循環中執行,可能需要十分之一秒才能運行,因爲JVM(以及Sun/Oracle的JVM)可以識別「熱點」並積極地優化它們。 –

+0

好吧,這很有趣,感謝您的幫助 – java123999