對老趙寫的簡單效能計數器的修改

2022-02-07 22:49:44 字數 3188 閱讀 5230

早上看到老趙寫的這個效能計數器,感覺很實用,不過老趙用了很多.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方法盡快 進入狀態...