Winapi 内联汇编程序执行时间 我想知道如何计算C++内联汇编程序的执行时间。 我的问题是滴答数的差值是0

Winapi 内联汇编程序执行时间 我想知道如何计算C++内联汇编程序的执行时间。 我的问题是滴答数的差值是0,winapi,assembly,inline-assembly,Winapi,Assembly,Inline Assembly,这是我的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

这是我的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

GetTickCount()
计算的刻度太粗,无法从如此短的汇编代码序列中捕获时间差。您必须使用x86来查看时间;指令助记符在汇编中通常是
RDTSC
。所有的警告都适用,例如:您的进程可能会被中断(这将使计数无效),时钟频率可能会发生实际变化,其他内核中的活动可能会影响内核的计时,….

GetTickCount()
计算的刻度太粗,无法从如此短的汇编代码序列中捕获时间差。您必须使用x86来查看时间;指令助记符在汇编中通常是
RDTSC
。所有的警告都适用,例如:您的进程可能会被中断(这将使计数无效),时钟频率实际上可能会改变,其他内核中的活动可能会影响内核的计时,…。

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

正如格雷格指出的,GetTickCount过于粗糙,无法用于对短代码序列进行计时。x86处理器上的时间戳计数器有一些限制,这使得它在多核处理器上非常不可靠。最可靠的解决方案是和功能。在*nix平台上,POSIX函数clock_gettime()也有类似的用途。

我使用了:

#包括
使用名称空间std;
typedef std::chrono::高分辨率时钟;
int main()
{
int X4,总和,平均值;
自动t1=时钟::现在();
自动t2=时钟::现在();
总和=平均值=0;
对于(int i=0;iax
“movl$0x0A,%%ebx;”//10->bx
“mul%%ebx;”//10*ax->ax
:“=a”(X4)
:“a”(X4)
:%ebx
);
t2=时钟::现在();
sum+=chrono::duration_cast(t2-t1).count();
}
平均值=总和/试验;
cout我用了:

#包括
使用名称空间std;
typedef std::chrono::高分辨率时钟;
int main()
{
int X4,总和,平均值;
自动t1=时钟::现在();
自动t2=时钟::现在();
总和=平均值=0;
对于(int i=0;iax
“movl$0x0A,%%ebx;”//10->bx
“mul%%ebx;”//10*ax->ax
:“=a”(X4)
:“a”(X4)
:%ebx
);
t2=时钟::现在();
sum+=chrono::duration_cast(t2-t1).count();
}
平均值=总和/试验;
cout-Important:将计时放在重复循环之外,否则您主要是在测试开销。(除非您确切地知道如何使用低开销的时间源(如
rdtsc
)处理微基准点,并且准备从延迟您的中断处理程序中排除异常值。重要提示:将计时放在重复循环之外,否则您主要是在测试开销。)。(除非您确切地知道使用低开销时间源(如
rdtsc
)来处理微基准点,并且准备从延迟您的中断处理程序中抛出异常值。
        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);