Pentium 處理器內建 64 位元時間戳記計數器 (TSC),RDTSC 指令可讀取其值 (EDX:EAX)。兩次讀取差值即為程式碼執行的時脈週期數,除以 CPU 頻率得精確秒數。
// 取得起始計數
__asm {
RDTSC
mov HighStart, edx
mov LowStart, eax
}
// 待測程式碼區塊
for (int i = 0; i < 100000; i++)
for (int j = 0; j < 100000; j++);
// 取得結束計數並計算差值
__asm {
RDTSC
mov HighEnd, edx
mov LowEnd, eax
sub eax, LowStart
cmp eax, 0
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
}
// 組合 64 位元週期數並換算秒數 (以 1.1GHz CPU 為例)
__int64 timer = (numhigh << 32) + numlow;
cout << (double)(timer / 1.1 / 1000000000) << endl;
RDTSC 回傳值於 EDX:EAX (高 32 位:低 32 位)sbb (含借位減法) 處理高 32 位#include <iostream>
using namespace std;
int main() {
long HighStart, LowStart, HighEnd, LowEnd, numhigh, numlow;
__asm { RDTSC; mov HighStart, edx; mov LowStart, eax; }
for (int i = 0; i < 100000; i++) for (int j = 0; j < 100000; j++);
__asm {
RDTSC; mov HighEnd, edx; mov LowEnd, eax;
sub eax, LowStart; cmp eax, 0; jg L1; neg eax; jmp L2;
L1: mov numlow, eax; L2: sbb edx, HighStart; mov numhigh, edx;
}
__int64 timer = (numhigh << 32) + numlow;
cout << "Elapsed: " << (double)(timer / 1.1 / 1000000000) << " sec" << endl;
return 0;
}