對一個服務器程序想統計每秒可以處理多少數據包要如何做?答案是用處理數據包的總數除以累記處理數據包用的時間這裡要指出的是 運行一段程序使用的cpu時間跟實際運行的時間是不一樣的附例如下
private void ShowRunTime()
{
TimeSpan ts = ProcessGetCurrentProcess()TotalProcessorTime;
Stopwatch stw = new Stopwatch();
stwStart();
int Circles = ;
for (int i = ; i < Circles; ++i)
{
ConsoleWriteLine(iToString());
}
double Msecs = ProcessGetCurrentProcess()TotalProcessorTimeSubtract(ts)TotalMilliseconds;
stwStop();
ConsoleWriteLine(stringFormat(循環次數:{} CPU時間(毫秒)={} 實際時間(毫秒)={} Circles Msecs stwElapsedTotalMilliseconds stwElapsedTicks));
ConsoleWriteLine(stringFormat( tick = {}毫秒 stwElapsedTotalMilliseconds / stwElapsedTicks));
}
程序輸出如下
循環次數: CPU時間(毫秒)= 實際時間(毫秒)=
tick = 毫秒
可以看出在這個例子中兩者差距比較大其原因如下
)Windows是多任務操作系統按照線程為單位對cpu時間輪詢分配即一個程序運行的中途可能被剝奪cpu資源供其他程序運行
)程序本身會有不占用cpu時間的等待過程這個等待可能是我們程序主動的比如啟動一個進程然後等待進程的結束也可能是我們沒有意識到的如例子的ConsoleWriteLine方法猜想其內部進行了一系列的異步I/O操作然後等待操作的完成這其間並沒有占用調用進程的cpu時間但耗費了很多等待時間
總結
)性能的測量應該用程序運行時間來測量當然也需要使用cpu時間作為參考如果兩者差距很大需要考慮為何出現這種情況
)Net的Stopwatch類可以精確到/毫秒基本可以滿足測量精度
From:http://tw.wingwit.com/Article/program/net/201311/13400.html