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

8 篇文章 1 订阅

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值