首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clock()函数的精度

clock()函数的精度
EN

Stack Overflow用户
提问于 2016-10-08 18:23:36
回答 1查看 9.5K关注 0票数 9

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

代码语言:javascript
复制
#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 = %ld\n", start_t);

   printf("Going to scan a big loop, start_t = %ld\n", 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 = %ld\n", end_t);

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

   return(0);
}

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

代码语言:javascript
复制
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循环的执行时间吗?我是不是做了一些错误的假设。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-08 20:06:18

clock函数使用的时间单位是任意的。在大多数平台上,它与处理器速度无关。它通常与外部定时器中断的频率有关,- which可能是在软件中配置的,或者是经过多年的处理器进化为兼容性而保持的历史值。您需要使用宏CLOCKS_PER_SEC进行实时转换。

代码语言:javascript
复制
printf("Total time taken by CPU: %fs\n", (double)total_t / CLOCKS_PER_SEC);

C标准库被设计成可在广泛的硬件上实现,包括没有内部计时器并依赖外部外设来判断时间的处理器。许多平台都有比time更精确的测量挂钟时间的方法,以及比clock更精确的测量CPU消耗的方法。例如,在POSIX系统(例如Linux和其他类Unix系统)上,您可以使用具有微秒精度的getrusage

代码语言:javascript
复制
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: %fs\n", (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模型(由于不同的缓存大小和布局),取决于加载代码的地址等。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39935820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档