2016-02-27 68 views
1

我有一個測試類與public void httpcall()方法,我需要得到這個方法的執行時間。爲了做到這一點,我在調用它之前和之後使用了System.nanoTime()。我從那段時間獲得執行時間。註解一個方法來打開性能跟蹤

代碼片段:

public class Test{ 

    public void httpcall(){ 
     try { 

      HttpResponse rs = HttpClientUtil.get("http://192.169.1.2:9090/plugins/restapi/v1/users/9223370580466120397/roster",RestOpenfire.ACCEPT, "8V9BUNA0f1gNQI3S"); 


     } catch (Exception e) { 

      System.out.println("Error : "+e); 

     } 
    } 

    public static void main(String[] args) { 

     Test test=new Test(); 
     long startTime = System.nanoTime(); 

      test.httpcall(); 

     long endTime = System.nanoTime(); 

     long duration = (endTime-startTime); 

     System.out.println("Execution Time : "+duration); 

    } 

} 

我想做出這樣@Time註解,使該方法的執行時間,像..

@Time 
public void httpcall(){ 
    try { 
     HttpResponse rs = HttpClientUtil.get("http://192.169.1.2:9090/plugins/restapi/v1/users/9223370580466120397/roster", 
       RestOpenfire.ACCEPT, "8V9BUNA0f1gNQI3S"); 
    } catch (Exception e) { 
     System.out.println("Error : " + e); 
    } 
} 

我怎麼能這樣做?

+1

註解不**做任何事情。他們只是元數據。您需要一個運行時框架來獲取對象,檢查對象方法中的註釋,調用方法並測量它們的時間。有這樣的框架。 Google for AOP。 –

+0

感謝您的建議。我可以在Spring框架中使用它嗎?春季AOP? –

+0

是的,Spring有AOP支持。我甚至可以肯定已經有了插入Spring的度量庫,並且可以實現你想要達到的目標。 –

回答

2

您可以嘗試使用aspectj,它可以將源代碼作爲構建的一部分進行更改,在稱爲編織的過程中更改.class文件或在運行時更改它。

https://mathewjhall.wordpress.com/2011/03/31/tracing-java-method-execution-with-aspectj/

思想,它可以是一個矯枉過正。 除非你有一個很難重構的龐大系統,否則我推薦使用模板方法。也就是說,

abstract class Measurable 
{ 
    protected void abstract doWork(); 

    public void execute(){ 
    stopWatch = StopWatch.start(); 
    doWork(); 
    stopWatch.stop(); 
    System.out.println(stopWatch.getTime()); 
    } 
} 

class MyHttpClient extends Measurable 
{ 
    doWork(){ 
     HttpResponse rs = HttpClientUtil.get("http://192.169.1.2:9090/plugins/restapi/v1/users/9223370580466120397/roster",RestOpenfire.ACCEPT, "8V9BUNA0f1gNQI3S"); 
    } 
} 

public static void main(String[] args) { 

    MyHttpClient test=new MyHttpClient(); 
    test.execute(); 
} 

而且MyHttpClient的所有應用都會調用的execute()方法

另請注意,我使用了StopWatch類,因爲它比使用System.currentTimeMillis更優雅和標準。 https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/StopWatch.html