早上看到老趙寫的這個效能計數器,感覺很實用,不過老趙用了很多.c# 3.0 的新語法,還用了 vista 和 server 2008 下特有的win32 api,對於還在用c#2.0 或者還工作在 xp 或者 server 2003 下的兄弟們,只能望**心嘆了。應老趙的要求,我修改了他的**,增加了對低版本c# 和 低版本windows 作業系統的支援。
老趙的原文: 乙個簡單的效能計數器:codetimer
修改說明
1. 採用 介面 取代了原**中的 lambda 表示式
2. 採用 getthreadtimes 這個api 函式替代了原**中的 querythreadcycletime
這裡需要說明的是 getthreadtimes 給出了執行緒在核心態和使用者態占用的時間,單位是 100 ns。兩個時間的總和就是執行緒占用的cpu時間。這個api的時間精度我看了一些資料似乎沒有達到 100ns. 所以getthreadtimes 這個api函式的進度沒有 querythreadcycletime 高。
下面是我修改後的**
注釋1: 2009-03-11 增加委託的呼叫,修改 gc.collect 引數,相容.net 2.0. 增加每次呼叫時間統計
增加了委託呼叫後,我發現同樣是測試空函式,採用介面比採用委託效率要略高一些,這和我的預計基本吻合,因為委託不是單純的函式呼叫,具體原理超出本文範圍,我就不多說了。
測試類測試**
採用介面
測試結果
thread sleep
time elapsed: 2,997ms
time elapsed (one time):2,997ms
cpu time: 0ns
cpu time (one time): 0ns
gen 0: 0
gen 1: 0
gen 2: 0
empty method
time elapsed: 138ms
time elapsed (one time):0ms
cpu time: 125,000,000ns
cpu time (one time): 12ns
gen 0: 0
gen 1: 0
gen 2: 0
string concat
time elapsed: 10,547ms
time elapsed (one time):0ms
cpu time: 10,546,875,000ns
cpu time (one time): 105,468ns
gen 0: 4102
gen 1: 2661
gen 2: 2545
stringbuilder conca
time elapsed: 4ms
time elapsed (one time):0ms
cpu time: 0ns
cpu time (one time): 0ns
gen 0: 0
gen 1: 0
gen 2: 0
採用委託
codetimer.time("thread sleep", 1, delegate() );
codetimer.time("empty method", 10000000, delegate() );
string a = "";
codetimer.time("string concat", 100000, delegate() );
stringbuilder s = new stringbuilder();
測試結果
thread sleep
time elapsed: 2,989ms
time elapsed (one time):2,989ms
cpu time: 0ns
cpu time (one time): 0ns
gen 0: 0
gen 1: 0
gen 2: 0
empty method
time elapsed: 156ms
time elapsed (one time):0ms
cpu time: 156,250,000ns
cpu time (one time): 15ns
gen 0: 0
gen 1: 0
gen 2: 0
string concat
time elapsed: 10,425ms
time elapsed (one time):0ms
cpu time: 10,406,250,000ns
cpu time (one time): 104,062ns
gen 0: 4102
gen 1: 2661
gen 2: 2545
stringbuilder conca
time elapsed: 4ms
time elapsed (one time):0ms
cpu time: 0ns
cpu time (one time): 0ns
gen 0: 0
gen 1: 0
gen 2: 0
簡單效能計數器 老趙版改良
老趙版 eaglet版 通讀了下他們的 老趙版在win7下是完美的,eaglet版 他在自己的續也說了getthreadtimes獲取執行緒實際執行時間上是有偏差的,我多次測試的確很不穩定。想來想去也沒有什麼辦法可以改進的。窩裡是win7,公司的電腦是苦逼的xp。也就是說我不能乙個 兩個地方通吃。沒...
關於WCF的效能計數器
公司的專案的服務端採用wcf,現在使用者反應系統響應慢 其實系統高峰期頂多100個人在用 現在boss讓我查查效能的瓶頸在哪。由於wcf的配置檔案只自定義的 採用這樣的框架現在我在myservicehost.cs 這個類裡新增servicemodel.diagnostic.performanceco...
乙個簡單的效能計數器 CodeTimer
static class codetimer 首先我們將靜態化建構函式,保證我們每次實用該類的時候,都先呼叫此方法。首先它會把當前執行緒及當前執行緒的優先順序設為最高,確保相對減少作業系統在排程上造成的干擾。然後呼叫一次timer方法進行 預熱 讓jit將il編譯成本地 讓time方法盡快 進入狀態...