很久之前寫的一篇文章了,現在趁著搬家,把它移過來,儘管不夠全面,但是一般意義上的工作夠用了。
測配量序已耗用時間的幾種方法
前一段時間在做一個最佳化程式效能的項目,為了測試最佳化的程度,粗略學習了一些測配量序已耗用時間的技術,www.amazon.co.uk/Computer-Systems-Programmers-Randal-Bryant/dp/013034074X在這個方面幾乎沒有可以參考的文獻,以下是我接觸到的一些資料,記錄在此,以備將來參考。
1: Computer System: A programmer's perspective
2: Software Optimization for High-Performance Computing:Creating Faster Applications 3: IA32 Intel Architecture Software Developer's Manual, Volume 3: System Programming Guide 我們都知道,根本不可能精確測量某一個程式啟動並執行確切時間,所謂的測量已耗用時間只是做一個近似的測量。我歸納總結的方法全部基於IA32及win32,Unix/Linux平台。
目前測配量序已耗用時間主要有兩類方法,一種是基於計時器Timer的,另一種是基於計數器Counter的。
一:基於Timer的測量方法。
缺點:精度不夠高,不能用於程式運行期間小於100ms的測量。
優點:準確性不是十分依賴於系統負載,並且在執行時間大於1s的程式上,與理論值之間的誤差很低。
方法:在程式開始時讀取計時器的內容,在程式終止前再次讀取Timer的內容。主要的介面函數有:
Unix/Linux:
clock_t times(struct tms *buf);
//return value:系統自啟動以來經過的時間滴答數,常數CLK_TCK表示每秒經過的時鐘滴答數 //parameter:一個指向tms結構的指標
//使用該函數時要包含標頭檔<sys/times.h> Win32:
DWORD GetTickCount(VOID)
//return value:the number of milliseconds that have elapsed since the system was started.
//使用時應包含<windows.h>,link階段應連結 kernel32.lib 如果要編寫可進行平台移植的代碼,可以利用下面的函數:
clock_t clock(void)
//常數CLOCKS_PER_SEC保證將該函數返回的值格式化為秒數
//使用該函數時要包含標頭檔<time.h> 二:基於Counter的測量方法。 缺點:只能用組合語言讀取,不能保證通用性,在系統負載很大的情況下,將極大的影響準確性
優點:精度高,並且因為得到的是程式執行期間所經過的刻度數,所以可大致估算出在不同硬體平台上程式的執行時間。
方法:在IA32體繫結構中,CPU內部有一個被稱為“時間戳記(TimeStamp)”的64位無符號數計數器,儲存自cpu上電以來所經過的刻度數。 一:WIN32中有一個QueryPerformanceCouter函數讀取的就是一個64位的計數器. 二:目前的compiler有的不支援RDTSC指令,如果在這種compiler下,可以利用__emit指令繞過compiler執行,應該在檔案頭加入: #define CPUID __asm __emit 0fh __asm __emit 0a2h
#define RDTSC __asm __emit 0fh __asm __emit 031h
微軟的C/C++編譯器從6.0版開始支援CPUID和RDTSC指令,所以可以直接在程式中嵌入彙編代碼,下面是一個簡單樣本: #include<stdio.h>
int main()
{
unsigned int cycle,i;
__asm
{
CPUID
RDTSC
mov cycle,eax
}
for(i=0;i<10000;i++)
;
__asm
{
CPUID
RDTSC
sub eax,cycle
mov cycle,eax
}
printf("the program duration cycle = %d/n",cycle);
return 0;
}
由於基於counter的測量方法受影響的因素較多,主要是Context Switch和Instruction Cache的影響,所以高精度計時必須設法消除上述兩種因素的影響,對Context Switch主要是採用在負載低的機器上多次計算求平均,而對Instruction Cache多採用提前載入需要測試程式碼片段的Instruction,然後執行測量的方法.具體做法參見
http://www.cs.usfca.edu/~cruse/cs210/rdtscpm1-1.pdf
Computer System: A programmer's perspective(Chapter 7)