2011-06-03 41 views
0

這是Java代碼:是否可以計算沒有變量的方法執行時間?

public void foo() { 
    final long start = System.nanoTime(); 
    // some operations... 
    System.out.println("done in " + (System.nanoTime() - start) + " nano sec"); 
} 

是否有可能做同樣的,但沒有start變量?事情是這樣的:

public void foo() { 
    // some operations... 
    System.out.println("done in " + calculateTime() + " nano sec"); 
} 
+0

創建'calculateTime()'返回'System.nanoTime() - start'。 – JonH 2011-06-03 17:56:07

+0

你有更多的細節爲什麼? – grundprinzip 2011-06-03 17:56:57

+0

這是一個愚蠢的問題。 – mre 2011-06-03 18:19:49

回答

3

這不是一個簡單的答案。我從這個問題推斷,你不希望用不必要的分析代碼混淆你的代碼,以後可能會刪除。在這種情況下,建議使用AOP。然後,您可以圍繞您想要分析的方法編織方面,並且這些方面將具有表示「開始」和「結束」變量的變量聲明。

+0

事實上,AOP是一個不錯的選擇,但我試圖找到一些其他的技巧,無論他們會多麼髒...... – yegor256 2011-06-03 18:13:17

+0

@ yegor256,你可能會使用相關技術,如使用'cglib'的Enhancer類,或'java.lang.reflect.Proxy'的調用處理函數。後者是骯髒的,但如果你的類實現可以被代理的接口,它將會工作。 – 2011-06-03 18:50:56

7

並非沒有變數地方。我的意思是你可以有一個靜態變量,並呼籲:

CustomTimer.startTiming(); 
// Do something 
System.out.println("Done in " + CustomTimer.endTiming() + " nanoseconds"); 

但不會是線程安全的,並且仍將真正使用的變量。

需要考慮的關鍵是您需要指出您感興趣的開始,並且必須記住這一點。

另外,您可以換行代碼別的東西做的時機:

public void foo() { 
    CustomTimer.reportTiming(new Runnable() { 
     @Override public void run() { 
      // Do operations here 
     } 
    }); 
} 

...但再次reportTiming方法需要保持一個變量。換句話說:如果你不知道你的出生日期(包括一年),你將如何計算你的年齡?

相關問題