文章編號: 306979 - 上次校閱: 2001年11月5日 - 版次: 1.0

如何:在 Visual C# .NET 中使用 QueryPerformanceCounter 來測量程式碼的執行時間

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
本文曾發行於 CHT306979

在此頁中

全部展開 | 全部摺疊

結論

當您測試程式碼來找出效能瓶頸時,應該使用系統所能提供最高解析能力的計時器。本文將逐步解說如何使用 QueryPerformanceCounter 函式來測量應用程式程式碼的執行時間。

注意 :JScript .NET 不能呼叫 Microsoft Windows API 函式。

建置並執行示範應用程式

  1. 啟用 Visual Studio .NET 並且建立一個 Visual C# 主控台應用程式 (Console Application)。
  2. 用下列程式碼取代預設的程式碼,它會以增量 100 來測量運算的時間:
    using System;
    using System.Runtime.InteropServices;
    
    namespace csConPerfCounter
    {
    	class Class1
    	{
    		[DllImport("kernel32.dll")]
    		extern static short QueryPerformanceCounter(ref long x);
    		[DllImport("kernel32.dll")]
    		extern static short QueryPerformanceFrequency(ref long x);
    
    		static void Main(string[] args)
    		{
    			long ctr1 = 0, ctr2 = 0, freq = 0;
    			int acc = 0, i = 0;
    			if (QueryPerformanceCounter(ref ctr1)!=0)	// Begin timing.
    			{
    				for (i=0; i<100; i++) acc++;		// Code being timed.
    				QueryPerformanceCounter(ref ctr2);	// Finish timing.
    				Console.WriteLine("Start Value: " + ctr1);
    				Console.WriteLine("End Value: " + ctr2);
    				QueryPerformanceFrequency(ref freq);
    				Console.WriteLine("QueryPerformanceCounter minimum resolution: 1/" + freq + " seconds.");
    				Console.WriteLine("100 Increment time: " + (ctr2 - ctr1) * 1.0 / freq + " seconds.");
    			}
    			else
    			   Console.WriteLine("High-resolution counter not supported.");
    
    			// Make the console window wait.
    
    			Console.WriteLine();
    			Console.Write("Press Enter to finish ... ");
    			Console.Read();
    		}
    	}
    }
  3. 儲存這個應用程式,並且按 F5 鍵進行編譯再執行應用程式。主控台視窗應該會顯示類似下列的輸出:
    Start Value: 281060816204
    End Value: 281060816269
    QueryPerformanceCounter minimum resolution: 1/3579545 seconds.
    100 Increment time: 1.81587324646009E-05 seconds.
    
    Press Enter to finish ...
  4. 按 ENTER 結束應用程式的執行,並且關閉 [主控台] 視窗。

疑難排解

  • 這個 API 呼叫在某些環境下可能會失敗。請檢查傳回值並調整您的程式碼,以確保您所收到的是有效的結果。
  • 若要得到最佳結果,請在沒有其他應用程式或伺服器處理序在執行的情況下多次測試這個應用程式。其他執行緒或處理序中的活動可能會影響系統使用於目標應用程式的時間比例。

參考

如需詳細資訊,請在線上說明中搜尋「QueryPerformanceCounter」和「QueryPerformanceFrequency」。

如需其他計時器的詳細資訊,請在線上說明中搜尋「timeGetTime」、「GetTickCount」和「System.DateTime class」。















本文件是根據 Microsoft Knowledgebase 文件編號 Q306979 翻譯的。若要參考原始英文文件內容,請至以下網址:

http://support.microsoft.com/support/kb/articles/Q306/9/79.asp (http://support.microsoft.com/kb/306979/en-us?ln=en-us&sd=gn&fr=0)

這篇文章中的資訊適用於:
  • Microsoft Visual C# .NET 2002 Standard Edition
關鍵字:?
kbhowto kbhowtomaster KB306979
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。