clock()函数在C中的精度

我有一些代码试图确定代码块的执行时间。

#include <time.h>
#include <stdio.h>

int main()
{
   clock_t start_t, end_t, total_t;
   int i;

   start_t = clock(); //clock start
   printf("Starting of the program, start_t = %ldn", start_t);

   printf("Going to scan a big loop, start_t = %ldn", start_t);
   for(i=0; i< 10000000; i++)  //trying to determine execution time of this block
   {
   }
   end_t = clock(); //clock stopped
   printf("End of the big loop, end_t = %ldn", end_t);

   total_t = (long int)(end_t - start_t);
   printf("Total time taken by CPU: %lun", total_t  );

   return(0);
}

我的机器上的代码片段的输出是

Starting of the program, start_t = 8965
Going to scan a big loop, start_t = 8965
End of the big loop, end_t = 27259
Total time taken by CPU: 18294

因此,如果我的CPU以21 MHz运行,并假设这是唯一执行的操作,则每个机器周期大约等于47纳秒,因此(18294 * 47)= 859818纳秒。

这是代码中for循环的执行时间吗? 我在这里做了一些不正确的假设。


clock功能使用的时间单位是任意的。 在大多数平台上,它与处理器速度无关。 它通常与外部定时器中断的频率有关(可以用软件配置),或者与通过多年处理器发展保持兼容性的历史数据相关联。 您需要使用宏CLOCKS_PER_SEC将其转换为实时。

printf("Total time taken by CPU: %fsn", (double)total_t / CLOCKS_PER_SEC);

C标准库被设计为可在各种硬件上实现,包括没有内部定时器并依赖外部外设来说明时间的处理器。 许多平台比time更准确地测量挂钟time ,更精确地测量CPU消耗的clock 。 例如,在POSIX系统(例如Linux和其他类Unix系统)上,您可以使用微妙精度的getrusage

struct timeval start, end;
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_utime;
…
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_utime;
printf("Total time taken by CPU: %fsn", (double)(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1e-6);

在可用的情况下, clock_gettime(CLOCK_THREAD_CPUTIME_ID)clock_gettime(CLOCK_PROCESS_CPUTIME_ID)可以提供更好的精度。 它具有纳秒级的精度。

请注意精度和精度之间的差异:精度是报告值的单位。 准确度是报告值与实际值的接近程度。 除非您正在开发一个实时系统,否则对于一段代码需要多长时间,包括调用测量函数本身,并没有很难保证。

一些处理器具有循环时钟来计算处理器周期而不是挂钟时间,但是这会得到非常系统特定的。

每当进行基准测试时,请注意您所测量的是在特定情况下在特定CPU上执行此特定可执行文件,结果可能会或可能不会推广到其他情况。 例如,你的问题中的空循环将被大多数编译器优化,除非你关闭优化。 测量未优化代码的速度通常是毫无意义的。 即使您在循环中添加实际工作,也要小心玩具基准测试:它们通常不具有与真实世界代码相同的性能特征。 在诸如PC和智能手机等现代高端CPU中,CPU密集型代码的基准测试通常对高速缓存效应非常敏感,并且结果可能取决于系统上正在运行的其他CPU,完全相同的CPU型号(由于不同缓存大小和布局),代码碰巧加载的地址等。

链接地址: http://www.djcxy.com/p/93563.html

上一篇: Accuracy of clock() function in C

下一篇: Overfitting after first epoch