调用: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