首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以time.h表示的时钟()精度

以time.h表示的时钟()精度
EN

Stack Overflow用户
提问于 2011-12-22 02:03:00
回答 4查看 20.8K关注 0票数 7

我正在尝试计算一个函数运行所使用的滴答数,并使用clock()函数执行此操作,例如:

代码语言:javascript
复制
unsigned long time = clock();
myfunction();
unsigned long time2 = clock() - time;
printf("time elapsed : %lu",time2);

但问题是它返回的值是10000的倍数,我认为这是CLOCK_PER_SECOND。有没有更精确的方法或等价的函数值?

我使用的是Ubuntu 64位操作系统,但我更希望该解决方案能在Windows和Mac OS等其他系统上运行。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-22 04:27:52

在POSIX中有许多更精确的计时器。

  • gettimeofday() -正式废弃,但广泛使用;microsecond resolution.
  • clock_gettime() - gettimeofday()的替代品(但不一定广泛使用;在旧版本的Solaris上,需要-lposix4才能链接),分辨率为纳秒。

还有其他具有或多或少的历史、可移植性和分辨率的亚秒级计时器,包括:

遗留-毫秒分辨率(在POSIX2004中标记为‘

  • ftime()’;而不是在POSIX 2008).
  • clock()中--您已经知道了)。请注意,它测量的是CPU时间,而不是流逝(挂钟) time.
  • times() - CLK_TCKHZ。请注意,这会测量父进程和子进程的CPU时间。

除非没有更好的方法,否则不要使用ftime()times()。最终的退路,但不能满足您的直接需求,是

  • time() -一秒分辨率。

clock()函数以CLOCKS_PER_SEC为单位进行报告,POSIX要求以1,000,000为单位,但是递增可能不太频繁(每秒100次是一个常见频率)。返回值必须由CLOCKS_PER_SEC定义才能获得以秒为单位的时间。

票数 10
EN

Stack Overflow用户

发布于 2011-12-22 05:10:56

根据clock()手册页,在POSIX平台上,CLOCKS_PER_SEC宏的值必须为1000000。正如您所说,从clock()获得的返回值是10000的倍数,这意味着分辨率为10ms。

还要注意,Linux上的clock()返回程序使用的处理器时间的近似值。同样,在Linux上,当调度程序以CONFIG_HZ频率运行时,会更新调度程序统计信息。因此,如果定期计时器滴答是100 Hz,您将获得10ms分辨率的进程CPU时间消耗统计信息。

Walltime测量不受此限制,可以更准确。clock_gettime(CLOCK_MONOTONIC,...)在现代Linux系统上提供纳秒分辨率。

票数 1
EN

Stack Overflow用户

发布于 2014-12-02 01:26:13

测量时间最精确的方法(但不是可移植性很高的)是计算CPU tick。

例如,在x86上

代码语言:javascript
复制
 unsigned long long int asmx86Time ()
 {
   unsigned long long int realTimeClock = 0;
   asm volatile ( "rdtsc\n\t"         
                  "salq $32, %%rdx\n\t"    
                  "orq %%rdx, %%rax\n\t"   
                  "movq %%rax, %0"         
                  : "=r" ( realTimeClock ) 
                  : /* no inputs */
                  : "%rax", "%rdx" );
   return realTimeClock;
 }

 double cpuFreq ()
 {
   ifstream file ( "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq" );
   string sFreq; if ( file ) file >> sFreq;
   stringstream ssFreq ( sFreq ); double freq = 0.;
   if ( ssFreq ) { ssFreq >> freq; freq *= 1000; } // kHz to Hz
   return freq;
 }

 // Timing

 unsigned long long int asmStart = asmx86Time ();
 doStuff ();
 unsigned long long int asmStop  = asmx86Time ();
 float asmDuration = ( asmStop - asmStart ) / cpuFreq ();

如果您没有x86,则必须根据您的CPU重新编写汇编程序代码。如果你需要最大的精度,不幸的是这是唯一的方法...否则,请使用clock_gettime()。

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

https://stackoverflow.com/questions/8594277

复制
相关文章

相似问题

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