2012-09-13 41 views
2

我需要測量應用程序上下文中許多不同方法的執行情況。如何創建通用例程以計算方法?

當然.NET具有秒錶類它允許一個容易時間代碼段與它的。開始()和.Stop()方法。

但是,以其正常方式使用Stopwatch類需要我用Stopwatch對象的實例來修飾每個方法,並調用它的.Start()和.Stop()方法。

我需要在數以百計的方法使用秒錶功能,並且不想污染與此代碼的所有方法。我也想有能力打開和關閉計時。

有沒有我可以實現我自己的代碼中一個通用的計時解決方案的簡單方法?如果是這樣,怎麼樣?代碼分析器這樣做,所以我認爲這一定是可能的。

+1

爲什麼不直接使用免費的探查http://smartbear.com/products/free-tools/aqtime-standard? – hatchet

+0

關於這個問題的答案可能會有所幫助:http://stackoverflow.com/q/1507405/ –

+0

還有一件要考慮的事情是,秒錶會測量流逝的時鐘時間,而不是CPU時間。看到這個測量CPU時間http://www.codeproject.com/Articles/31152/ExecutionStopwatch – hatchet

回答

5

只是一個想法。聲明方法如下

public static long Measure(Action action) 
{ 
    Stopwatch sw = Stopwatch.StartNew(); 
    action(); 
    return sw.ElapsedMilliseconds; 
} 

和使用作爲

var duration = Measure(() => MyMethod(param1)); 
+0

+1:非常優雅。 –

+1

+1。順便說一句,前兩行可以壓縮成'Stopwatch sw = Stopwatch.StartNew()' –

+0

哇!像魅力一樣工作!非常感謝你! –

0

你也可以看看AOP和動態地創建用於定時的方法(只能在非靜態公共方法的工作,雖然)的包裝。

如果您使用的IoC你基本上只需要一個裝飾註冊的類型,這當然可以定製,開啓和關閉如果需要的話,甚至在特定的方法。

我用城堡:前DynamicProxy實現只是這(對於時間和錯誤日誌記錄)。

編輯:一個例子(從舊版本的城堡:動態代理)

TimerInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     Stopwatch watch = new Stopwatch(); 
     watch.Start(); 
     invocation.Proceed(); 
     watch.Stop(); 
     //here you have the value which could be used to log (which I assume you want) 
    } 
} 

new ProxyGenerator().CreateInterfaceProxyWithTarget<IMyInterface>(implementedObject, new TimerInterceptor()); 
+0

謝謝彼得!我會牢記這個方法。 –