有很多時候我們需要對程式碼不同段計算一個執行時間,並希望通過節點樹的方式表達現每段程式碼的執行時長。在.Net下似乎找不到這樣一個功能類,所以花了一些時間實現這樣一個程式碼執行計時器。首先看一下簡單的需求。
功能程式碼
JoinTable table = Order.employeeID.InnerJoin(Employee.employeeID) .InnerJoin(Order.customerID, Customer.customerID) .Select(Order.orderID.At(), Customer.companyName, Employee.firstName, Employee.lastName); IList<OrderView> orders = new Expression().List<OrderView>(table);以上程式碼是簡單地構建一個關聯查詢表,然後根據這個關聯表執行一個簡單的訂單查詢。
加入計時跟蹤
現在需要針對以上程式碼新增一個執行時間跟蹤,主要包括總體執行時間,構建查詢表的時間和查詢的時間。那隻需要新增以下程式碼即可達到跟蹤效果。
TimeWatch.________________________________________________________("list order"); TimeWatch.________________________________________________________("create table"); JoinTable table = Order.employeeID.InnerJoin(Employee.employeeID) .InnerJoin(Order.customerID, Customer.customerID) .Select(Order.orderID.At(), Customer.companyName, Employee.firstName, Employee.lastName); TimeWatch.________________________________________________________(); TimeWatch.________________________________________________________("List"); IList<OrderView> orders = new Expression().List<OrderView>(table); TimeWatch.________________________________________________________(); TimeWatch.________________________________________________________();
計時結果
TimeWatch.Report(o => { Console.WriteLine(o.ToString()); });通過以上程式碼就可以把每段執行時間通過樹的方式展現出來。
取消和啟用跟蹤
由於新增了相關跟蹤程式碼,所以使用上就會讓人擔心這些程式碼新增了會不會影響程式碼的總體效能,計時器在實現這些方法的過程中新增了Conditional特性,所以當釋出程式碼的時候把DEBUG的編譯符不選上那相關的跟蹤程式碼都不會被編譯;因此在編寫這些跟蹤的時候完全是不用擔心對釋出的程式碼產生影響。
更完整的結果
如果下層的元件新增了相關程式碼,那隻要在編譯的時候啟用DEBUG編譯符,那更深層次執行時間樹會表現出來。