在C语言中编写一个计算加法执行时间的程序

3

我想查找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。我也尝试将其转换为纳秒,但仍然无效。


1
最好查看加法语句的反汇编,找出指令所需的时钟数。根据处理器的操作频率计算时间。 - Vagish
1
一个提示:始终使用 int main() 和相应的 return 语句。 - Sourav Ghosh
3
可能没有任何影响,但我建议遵循C标准。请查阅C11标准的5.1.2.2.1章节。 - Sourav Ghosh
5
试图使用执行上千条指令的函数调用来计时可能是一个寄存器-寄存器加法操作,这样做并不明智。 - Martin James
2
除了测量之外,程序什么也不做。没有必要添加任何东西,非时钟、非输出代码都不需要运行。实际上,它在测量什么时候什么也没做。即使您具有适当的粒度和无噪声的环境,它也会测量错误的事情,即什么也没有。 - R. Martinho Fernandes
显示剩余18条评论
3个回答

6
你的代码无法正常工作的简短答案是,你的程序执行得太快了。CLOCKS_PER_SEC通常被定义为每个时钟周期等于一微秒(CLOCKS_PER_SEC等于100万) - 一个单独的加法操作所需的时间远远少于这个时间。实际上,在我的机器上,我必须执行数百万条指令才能获得非零测量结果。
在C中没有标准的方法来测量单个加法指令的长度。你可以使用现代x86处理器中的rdtsc指令来测量CPU时钟周期,尽管精度并不能保证。

4
非常难获取某些指令所需的一些时钟。因为这取决于许多因素,如CPU时钟频率、CPU核心数、处理器架构(内存缓存分配方式)、指令调度和分支预测、在您测量的指令之前执行的指令等。
如果您需要测量非常短的时间间隔或需要非常高的精度,请使用平台相关资源。
每个CPU制造商都包括一些时钟计数器(寄存器),并且这些计数器会对该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

-3

使用gettimeofday()代替。

clock()的时间粒度可能不够。


1
不,clock()测量的是该进程的CPU时间,这正是您想要的。墙上时间不是您想要测量的。 - Lightness Races in Orbit
如果你使用gettimeofday()而不是clock(),输出结果可能像“Execution Time= -1.0”这样荒谬。gettimeofday只是错误的测量工具。它根本不能用于测量时间的流逝:它未能满足后续调用返回等于或高于先前调用结果的基本要求。 - R. Martinho Fernandes
无论如何,碳14测年法都不是衡量咖喱速食解冻时间的合适工具。 - Martin James
1
@LightnessRacesinOrbit 我明白gettimeofday()测量的是经过的时间,与执行时间不同;但它比clock()具有更好的精度,并且被广泛用于基准测试/测量代码执行时间。这取决于您对测量的精度要求如何。 - Pandrei
1
@Pandrei:不,这不是真的;那样做太荒谬了。如果你使用墙上时间来测试代码,则你的基准测试是错误的。增加粒度(即:幻觉)并不会改变这一点。至于你最后的评论,他正在测量一个操作!所以他必须非常准确。所有这些都不会起作用。 - Lightness Races in Orbit
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接