内联汇编程序执行时间

时间:2012-12-15 14:10:54

标签: winapi assembly inline-assembly

我想知道如何计算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); 

3 个答案:

答案 0 :(得分:2)

GetTickCount()计算的滴答,太粗糙,无法捕获这些短汇编代码序列的时差。您将不得不使用x86 Time Stamp Counter来查看时间;指令助记符通常在汇编中RDTSC。所有注意事项都适用,例如:您的过程可能会中断(这会使计数无效),时钟频率可能实际发生变化,其他核心的活动可能会影响核心的时间,....

答案 1 :(得分:2)

正如GregS指出的那样,GetTickCount太粗糙,无法用于计时短序列代码。在x86处理器上找到的时间戳计数器有一些限制,使其在多核处理器上非常不可靠。最可靠的解决方案是QueryPerformanceCounterQueryPerformanceFrequency功能。在* nix平台上,POSIX函数clock_gettime()用于类似目的。

答案 2 :(得分:0)

我用过:

#include <iostream>
using namespace std;
typedef std::chrono::high_resolution_clock Clock;
int main()
{
  int X4,sum,avg;
  auto t1 = Clock::now();
  auto t2 = Clock::now();
  sum=avg=0;
  for( int i=0; i<TRIALS; i++ )
    {
      X4=17;
      t1 = Clock::now();
      asm  (
	    "movl %0, %%eax;" // X->ax
	    "movl $0x0A, %%ebx;" // 10->bx
	    "mul %%ebx;" // 10*ax->ax
	    : "=a" (X4)
	    : "a" (X4)
	    : "%ebx"
	    );
      t2 = Clock::now();
      sum+=chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
    }
  avg=sum/TRIALS;
  cout << "| Product:  " << X4<< "  "<< avg << " nanoseconds |" << endl;
}