當須要知道某段代碼到底耗時多少時,使用最最頻繁的場景,就是計時開始,計時結束獲得耗時時間(一般以毫秒爲單位,再轉換成秒也是特別容易)。函數
一般狀況下,會使用一個變量記錄開始時間,結束時再進行時間運算顯示結果,但代碼有點多,且時間加減本就不容易(哈哈)。而使用其它工具,得找(哈哈),並且它可能給你個並很差關聯的名字。工具
那就來自定義一個耗時計數器吧,它有個開始,有個結束,結束時返回耗時計數。關鍵,這裏用一個本身一碰到耗時計數就能想起的名字。spa
於時,有了如下類定義:code
/// <summary> /// 耗時計數器 /// </summary> public class TimeConsumingCounter { // 建立時默認爲建立時間,這樣不調用 Start 也能夠 private DateTime _StartTime = DateTime.Now; // 計時開始 public void Start() { _StartTime = DateTime.Now; } // 計時結束(輸出毫秒) public long Over() { var timespan = DateTime.Now - _StartTime; return Convert.ToInt32(timespan.TotalMilliseconds); } }
來來來,看一下使用方法:it
TimeConsumingCounter tcc = new TimeConsumingCounter(); tcc.Start(); for (var i = 0; i < 10000000; i++) { } // 輸出耗時計數 Debug.Write(tcc.Over());
也許毫秒並不能知足個人須要,不想再進行秒分的轉換。那就再來個 TimeSpan 的返回吧,它自帶轉換。io
// 取得間隔 public TimeSpan Span() { return DateTime.Now - _StartTime; }
因而輸出能夠是: Debug.Write(tcc.Span().TotalMinutes);
class
其實,還想更直接點,直接告訴我那個過程運行有多少時間吧。變量
先看看,最終使用的兩個示例:
1.示例一原理
Debug.Write( TimeConsumingCounter.TimeConsuming(() => { for (var i = 0; i < 10000000; i++) { } }).TotalMilliseconds );
2.示例二擴展
private void Foo() { for (var i = 0; i < 10000000; i++) { } } // 輸出 Foo 運行耗時 Debug.Write( TimeConsumingCounter.TimeConsuming(Foo).TotalMilliseconds );
原理其實很簡單,爲工具類增長一個靜態方法,把須要耗時統計的代碼以參數的形式傳遞給它去計時就能夠了。這個方法中,使用到了 Action,是 C# 的一種委託,可先熟悉下。靜態方法以下:
/// <summary> /// 靜態方法,運行指定函數,返回耗時結果 /// </summary> /// <param name="action"></param> /// <returns></returns> public static TimeSpan TimeConsuming(Action action) { TimeConsumingCounter tcc = new TimeConsumingCounter(); action(); return tcc.Span(); }
/// <summary> /// 耗時計數器 /// </summary> public class TimeConsumingCounter { // 建立時默認爲建立時間,這樣不調用 Start 也能夠 private DateTime _StartTime = DateTime.Now; // 計時開始 public void Start() { _StartTime = DateTime.Now; } // 計時結束(輸出毫秒) public long Over() { var timespan = DateTime.Now - _StartTime; return Convert.ToInt32(timespan.TotalMilliseconds); } // 取得間隔 public TimeSpan Span() { return DateTime.Now - _StartTime; } /// <summary> /// 靜態方法,運行指定函數,返回耗時結果 /// </summary> /// <param name="action"></param> /// <returns></returns> public static TimeSpan TimeConsuming(Action action) { TimeConsumingCounter tcc = new TimeConsumingCounter(); action(); return tcc.Span(); } }