clock计时方式产生巨大误差的陷阱

调用:clock()

功能: 返回处理器调用某个进程或函数所花费的时间。

用法: clock_t clock(void);

说明:clock_t其实就是long,即长整形。该函数返回值是硬件滴答数,要换算成秒或者毫秒,需要除以CLK_TCK或者 CLK_TCK CLOCKS_PER_SEC。

但clock调用在多核情况下会产生巨大误差。原因是clock的实现方式决定了它不适合多核cpu场景。

Clock实现原理:

clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的,一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

clock函数:clock_t clock(); 这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。

clock_t定义:

#ifndef _CLOCK_T_DEFINED
  typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。

Clock的实现是基于时钟计时单元的。问题出在cpu的时钟计时单元上。当采用多核cpu时,进程或线程调用clock,记录了当前核时钟。但在下次调用clock之前很可能发生cpu调度,进程或线程被调度到其他cpu上运行。这导致两次取得计时单元并不是同一个cpu的,产生计时错误。

参考:

读取时间计数器的指令

http://hi.baidu.com/wooutstanding/blog/item/c997205ea9ea649d800a18e9.html

 

你可能感兴趣的:(clock计时方式产生巨大误差的陷阱)