2012-12-15 192 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()用于类似的目的。