2012-12-23 17 views
3

有關如何測量執行時間的問題已經在SO上被詢問了很多次,例如參見herehere。然而,這些問題主要集中在使用哪些定時功能上。如何測量以可靠方式執行一段代碼所花費的時間?

我感興趣的是如何使結果重現。例如,由於多任務處理,測試代碼的執行可能會被影響結果的後臺進程中斷。爲了解決這個問題,我看到一些基準測試可以執行多次運行並且花費最佳時間(除了在循環中多次運行代碼)。

關於如何使結果更可靠和可重現,是否還有其他建議或想法?

回答

1

首先是有用的代碼可能要分開,你想從轉移到您不想測試代碼速度測試的代碼。特別是確保這樣的代碼不會執行文件IO,顯示輸出,日誌記錄,控制檯輸出等(當然,除非您自己測試IO代碼)

您也可以加載所有需要做測試運行的數據所以數據加載不被測量。

好的技巧是儘可能少的測試。如果您可以追蹤到那些影響最大的幾條線,那麼您可以找到一種方法,從其餘代碼中分別測試它們。也許甚至可以將它們複製/粘貼到爲此唯一目的而設計的新功能中。

如果您真的打算進行高清時間計數,您還可以嘗試使用OS提供的功能來輸入實時或高優先級的CPU模式。

在某些情況下,您可能想要查看生成的低級別機器代碼,然後使用CPU製造商(或VM實施)的參考數據來計算有問題的代碼將採用多少'cpu-ticks'。由於許多cpu/vm指令根據流水線/操作數/ cpu模型等具有可變執行時間,所以即使這種方法也會提供近似值。

所以最好的建議是正確設置您的測量誤差範圍。通常我個人認爲這個10%,當我開始時間測試一些代碼。然後這個值可以(通常)減少。但它從來沒有0%。所以當你的程序輸出「Execution Time:%i ns」時,你可以(也可能應該)總是打印「+ - X ns」。

0

請檢查它可以在Java中

package com.test.stackoverflow; 

public class Sample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     long startTime = System.currentTimeMillis(); 


     for(int i=0;i<10000; ++i) 
     { 
      System.out.println("You ae executng Looop"); 
     } 
     long endTime = System.currentTimeMillis(); 


     long diffTime = endTime - startTime; 

     System.out.println("Start Execution at in Time (Seconds) "+ startTime * 0.001); 

     System.out.println("End Execution at in Time (Seconds) "+ endTime * 0.001); 

     System.out.println("Difference in Time (Seconds) "+ diffTime * 0.001); 

    } 

} 
相關問題