一、獲取計時數據
和其他Windows服務器一樣,在Windows 2003 Server上最能發揮性能優勢的是多線程程序。Windows 2003 Server支持各種多處理器系統,同時也能在單處理器的P4系統上運行。對于單處理器P4系統,Windows 2003 Server將發揮出Intel超線程技術提供的各種硬件線程執行引擎的優勢。
開發服務器應用的人都知道,之所以要開發并行程序,真正的原因只有一個——性能。然而,眾所周知,性能改善是一個比較模糊的目標,因為多線程代碼的性能通常只能靠經驗估計。在單線程程序中,性能改進程度一般可以精確地預知,例如減少了多少指令和延遲較高的操作,但多線程代碼不同,Windows平臺中線程調度是不確定的,也就是說,在Windows中應用程序可以要求調度程序運行線程,但調度程序何時(是否)運行線程則遠遠超出了應用程序代碼的控制范圍。
在測試性能時,開發者很快會遇到一個問題,這就是Windows內建的標準時鐘實在不夠精確,其可靠測量事件時間的解析度很難高于一秒,這樣,要確定一個代碼片段是否真正得到優化就很困難了。如果一定要用Windows的標準時鐘進行測試,必須利用循環讓代碼運行幾百萬次,才能獲得有效的時間數據。絕大多數情況下,使用這類循環意味著修改應用程序。
其實,還有更好的辦法,這就是Win32高解析度時鐘,涉及的函數有兩個:QueryPerformanceCount(),QueryPerformanceFrequency()。在Intel系統中,從P II開始,這些函數依賴于Pentium芯片內建的一個計數器。當一個Intel系統啟動時,一個64位的寄存器跟蹤著消逝的時鐘周期,這個計數器提供了解析度極高的計時設備。
整個64位寄存器都要用到。32 bit的整數大約能計數20億,對于當前每秒運行20-30億個周期的處理器,32 bit的計數器會在一秒或更少的時間內溢出,64 bit的計數器則能容納這些秒數的20億倍,按20億秒計算就是約63年——可以相信,這已經遠遠超出測量任何程序的要求了。
要對一個事件進行計時,只需獲得事件開始之前、結束之后的時鐘計數。下面的代碼不依賴于Win32(即,從C/C++直接訪問),稍后我們再看看操作系統提供的函數。我們首先定義一個數據結構,然后再來看填寫該結構的代碼:
typedef struct _BinInt32 { __int32 i32[2];
}
BigInt32; typedef struct _BigInt64 { __int64 i64
;
} BigInt64; typedef union _bigInt { BigInt32 int32val
;
BigInt64 int64val
;
}
BigInt
;
文章來源于領測軟件測試網 http://www.kjueaiud.com/