C#實現測量程序運行時間及cpu使用時間(轉載)

  對一個服務器程序想統計每秒可以處理多少數據包,要如何做?答案是用處理數據包的總數,除以累記處理數據包用的時間。這裏要指出的是, 運行一段程序,使用的cpu時間,跟實際運行的時間是不一樣的。附例如下:

    private void ShowRunTime()
            {
            TimeSpan ts1 
= Process.GetCurrentProcess().TotalProcessorTime;
            Stopwatch stw 
= new Stopwatch();
            stw.Start();

            
int Circles = 1000;
            
for (int i = 0; i < Circles; ++i)
            {
                Console.WriteLine(i.ToString());
            }

            
double Msecs = Process.GetCurrentProcess().TotalProcessorTime.Subtract(ts1).TotalMilliseconds;
            stw.Stop();

            Console.WriteLine(
string.Format("循環次數:{0} CPU時間(毫秒)={1} 實際時間(毫秒)={2}", Circles, Msecs, stw.Elapsed.TotalMilliseconds, stw.ElapsedTicks));
            Console.WriteLine(
string.Format("1 tick = {0}毫秒", stw.Elapsed.TotalMilliseconds / stw.Elapsed.Ticks));
        }

    程序輸出如下:

    循環次數:1000 CPU時間(毫秒)=50.072 實際時間(毫秒)=666.9071
    1 tick = 0.0001毫秒

    可以看出在這個例子中,兩者差距比較大,其原因如下:

    1)Windows是多任務操作系統,按照線程爲單位對cpu時間輪詢分配。即一個程序運行的中途,可能被剝奪cpu資源,供其他程序運行。

    2)程序本身會有不佔用cpu時間的等待過程。這個等待可能是我們程序主動的,比如啓動一個進程,然後等待進程的結束;也可能是我們沒有意識到的,如例子 的Console.WriteLine方法,猜想其內部進行了一系列的異步I/O操作然後等待操作的完成,這其間並沒有佔用調用進程的cpu時間,但耗費 了很多等待時間。

    總結:

    1)性能的測量,應該用程序運行時間來測量,當然也需要使用cpu時間作爲參考,如果兩者差距很大,需要考慮爲何出現這種情況。

    2).Net的Stopwatch類可以精確到1/10000毫秒,基本可以滿足測量精度。
發佈了4 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章