2012-12-15 178 views
1

我想知道如何計算C++內聯彙編程序的執行時間? 我的問題是Tickcounts之差爲0內聯彙編程序執行時間

這裏是我的cpp的代碼:

const int N = 100000; 
short x[4*N]; 

short a[4*N]; 
    for (int j=0;j<4*N;j++) { 
     x[j] = rand() % 1000; 
     a[j] = rand() % 5000; 
    } 
DWORD dwAStart = GetTickCount(); 

__asm { 

    xor eax,eax 

     mov ecx,N 
    xor esi,esi 

A1:

 emms 
    movq  mm1,qword ptr x[esi] 
    movq  mm2,mm1 
    punpcklwd mm1,mm6 
    punpckhwd mm2,mm6 
    movq  mm0,qword ptr a[esi] 
    movq  mm3,mm0 
    punpcklwd mm0,mm6 
    punpckhwd mm3,mm6 
    pmullw  mm0,mm1 

    paddsw  mm0,mm3 

    add esi , 8 
    loop a1 
}; 
DWORD dwAInterval = GetTickCount() - dwAStart; 
printf("Operation is completed through %d ms (Assembler)!\n", (int)dwAInterval); 

回答

1

蜱,如統計出GetTickCount(),太粗捕獲與這樣短的彙編代碼序列的時間差異。您將不得不使用x86 Time Stamp Counter來查看時間;指令助記符通常在彙編中爲RDTSC。所有的注意事項都適用,比如:你的進程可能會被中斷(這會使計數無效),時鐘頻率可能實際上會改變,其他內核中的活動可能會影響核心的時間,...

2

As GregS points GetTickCount太粗糙了,無法用於定時短序列的代碼。在x86處理器上發現的時間戳計數器有一些限制,這使得它在多核處理器上非常不可靠。最可靠的解決方案是QueryPerformanceCounterQueryPerformanceFrequency函數。在* nix平臺上,POSIX函數clock_gettime()用於類似的目的。