我想在C中找到加法指令的执行时间。我知道如何找到使用for循环,但我不想使用任何循环。我想找一条指令。我写了这段代码。
void main()
{
int a=34,b=56,c,i;
clock_t start,end;
double exectime;
start=clock();
c=a+b;
end=clock();
exectime=(double)(end-start)/CLOCKS_PER_SEC;
printf("\nExecution Time= %f \n",exectime);
}
但输出结果为0.我也试过转换为纳秒,但仍无法正常工作。
答案 0 :(得分:6)
您的代码无法正常工作的简短答案是您的程序执行得太快。 CLOCKS_PER_SEC
通常定义为每个tick等于1微秒(CLOCKS_PER_SEC
等于1百万) - 单个加法运算远小于此值。事实上,在我的机器上,我必须执行数百万条指令才能获得非零测量值。
在C中没有标准方法来测量单个添加指令的长度。您可以使用现代x86处理器中的rdtsc指令来测量CPU时钟周期,但即使这样也不能保证精度。
答案 1 :(得分:4)
获取某些指令所需的时钟非常困难。因为它取决于很多因素,如CPU时钟频率,CPU核心数,处理器架构(如何分配内存缓存),指令调度和分支预测,在测量指令之前执行的指令等
如果您需要测量非常短的时间间隔,或者您需要极高的精度,您可以使用与平台相关的资源。
每个CPU制造商都包含一些时钟计数器(REGISTERS),并且这些时钟计数器会针对该CPU内核上的每个时钟计时器递增。因此,如果您的CPU允许(取决于制造商),您可以访问这些寄存器,并计算更精确的执行时间。 示例:最着名的计数器寄存器是TSC(时间戳计数器),在带有Pentium的x86处理器中引入,并且从那时起包含在所有CPU设计中 - 包括x86_64平台。它是一个64位寄存器,用于计算CPU时钟周期;它可以从内核空间和用户空间中读取。
<asm/msr.h>
unsigned long start, stop;
rdtscl(start);
//Your measured code here
rdtscl(stop);
printk("Time Taken: %li\n", stop- start);
即使它也不完美,因为在读取这些寄存器时会有一些时钟周期失效,但无论如何我们无法将其删除。
有关详细信息,请参阅@Daniel提供的链接。和http://www.makelinux.net/ldd3/chp-7-sect-1
答案 2 :(得分:-3)
而是使用gettimeofday()
。
clock()
时间粒度可能不够。