程序在c中查找添加的执行时间

时间:2015-02-12 10:45:52

标签: c

我想在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.我也试过转换为纳秒,但仍无法正常工作。

3 个答案:

答案 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()时间粒度可能不够。