我想知道如何计算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);
答案 0 :(得分:2)
由GetTickCount()
计算的滴答,太粗糙,无法捕获这些短汇编代码序列的时差。您将不得不使用x86 Time Stamp Counter来查看时间;指令助记符通常在汇编中RDTSC
。所有注意事项都适用,例如:您的过程可能会中断(这会使计数无效),时钟频率可能实际发生变化,其他核心的活动可能会影响核心的时间,....
答案 1 :(得分:2)
正如GregS指出的那样,GetTickCount太粗糙,无法用于计时短序列代码。在x86处理器上找到的时间戳计数器有一些限制,使其在多核处理器上非常不可靠。最可靠的解决方案是QueryPerformanceCounter和QueryPerformanceFrequency功能。在* 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;
}