2011-09-19 94 views
6

我想計算我的函數在Java中執行多少CPU時間。目前我正在做如下。Java中的CPU執行時間

long startTime = System.currentTimeMillis(); 
    myfunction(); 
    long endTime = System.currentTimeMillis(); 
    long searchTime = endTime - startTime; 

但我發現,對於相同的I/P,我根據系統負載得到不同的時間。

那麼,如何獲得我的函數執行的確切CPU時間。

回答

6

隨着JVM預熱,所花費的時間將有所不同。第二次運行時總是會比第一次快。 (第一次加載類並調用靜態塊)在運行方法10,000次後,它會再次更快(將代碼編譯爲本地機器代碼的默認閾值)

要獲得可重現的平均值微型基準測試的時機,我建議你忽略前10000次迭代,並在此之後運行2-10秒。

例如

long start = 0; 
int runs = 10000; // enough to run for 2-10 seconds. 
for(int i=-10000;i<runs;i++) { 
    if(i == 0) start = System.nanoTime(); 
    // do test 
} 
long time = System.nanoTime() - start; 
System.out.printf("Each XXXXX took an average of %,d ns%n", time/runs); 

非常重要:只有做好每方法這些循環中的一個。這是因爲它基於如何使用它來優化整個方法。如果你有一個像這樣的繁忙循環,後面的循環會顯得比較慢,因爲它們沒有運行並且會被優化得很差。

0

有許多分析器(Jprofile,JProbe的,Yourkit)可用來分析這樣的數據。不但如此,但更多...(如內存利用率,線程細節等)