我编写了一个简单的程序来测量使用RDTSC指令的代码执行时间。但我不知道我的结果是否正确,并且我的代码有问题......我不知道如何验证它。使用RDTSC指令在C中测量代码执行时间
#include <stdio.h>
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
#define N (1024*4)
unsigned cycles_low, cycles_high, cycles_low1, cycles_high1;
static __inline__ unsigned long long rdtsc(void)
{
__asm__ __volatile__ ("RDTSC\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low)::
"%rax", "rbx", "rcx", "rdx");
}
static __inline__ unsigned long long rdtsc1(void)
{
__asm__ __volatile__ ("RDTSC\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t": "=r" (cycles_high1), "=r" (cycles_low1)::
"%rax", "rbx", "rcx", "rdx");
}
int main(int argc, char* argv[])
{
uint64_t start, end;
rdtsc();
malloc(N);
rdtsc1();
start = (((uint64_t)cycles_high << 32) | cycles_low);
end = (((uint64_t)cycles_high1 << 32) | cycles_low1);
printf("cycles spent in allocating %d bytes of memory: %llu\n",N, end - start);
return 0;
}
您需要通过添加cpuid指令或使用rdtscp将序列化添加到rdtsc。请参阅英特尔有关进行测量的最佳做法的白皮书。 http://www.intel.com/content/www/us/en/embedded/training/ia-32-ia-64-benchmark-code-execution-paper.html。 – Imran
请勿使用'RDTSC'。使用“时钟”或操作系统特定的功能。对于Linux阅读[时间(7)](http://man7.org/linux/man-pages/man7/time.7.html),然后使用[clock_gettime(2)](http://man7.org/linux /man-pages/man2/clock_gettime.2.html) –
@BasileStarynkevitch感谢您的回复。我正在研究内核2.4.37,我可否知道你推荐哪个函数来测量内核中的时间?谢谢你的时间。 – HuangJie