Winapi 内联汇编程序执行时间 我想知道如何计算C++内联汇编程序的执行时间。 我的问题是滴答数的差值是0
这是我的cpp代码: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
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);