boost.timer:一个优秀的计时类库

在编写程序的时候很多种情况下我们都需要计时,比如我们在测试软件的性能时,或者一个和时间有关的软件时 boost.timer 就特别有用 ,boost.timer 提供两个类 cpu_timer auto_cpu_timer ,它们都包含在 boost::timer 命名空间内。

auto_cpu_timer

废话不多说先看一个例子:


复制代码
//  if on win32 this make the program auto link to dynme library  
#define BOOST_ALL_DYN_LINK   
#include <boost/timer/timer.hpp>  
  
void func(some arguments)  
{  
    ...  
}  
  
int main( void)  
{  
     //  a boost.timer class auto_cpu_time  
    boost::timer::auto_cpu_time   
    timer(“%w clock time,%t totle program time(%p%)”);  
  
     for ( int i =  0;i <  10000;i++)  
    {  
        ...  
        func(some arguments);  
        ...  
    }
}
复制代码
      程序运行结果
0.318385 clock time, 0.312002 totle program time( 98.0%) 

      我们看到代码中仅仅声明了一个boost::timer::auto_cpu_timer类,for循环的运行时间(包括clock time即世界时间,和cpu time即程序在cpu中运行的时间)就被计算出来了,究其原因,我们大概可以猜想到auto_cpu_timer在构造阶段调用了计时相关的函数,在析构阶段结束计时,并以一定的格式输出结果,这其中有一个细节就是:定义在区块中的自动变量(auto value)都会在离开区块是时动析构,这里的析构对于内建的类型如int char等就是释放栈空间,对于用户定义类型就是调用析构函数后释放空间。上述过程是C++语言规定的,它由C++编译器强制保证。

正如auto_cpu_timer的名字一样,我们只需要简单的定义一个auto_cpu_timer变量便可方便的计时了,auto_cpu_timer有六个构造函数:

复制代码
explicit auto_cpu_timer( short places = default_places);      //  #1  
    auto_cpu_timer( short places,  const std:: string& format);     //  #2  
     explicit auto_cpu_timer( const std:: string& format);          //  #3  
    auto_cpu_timer(std::ostream& os,  short places,  
                const std:: string& format)                    //  #4  
     explicit auto_cpu_timer(std::ostream&os,  
                         short places = default_places);      //  #5  
    auto_cpu_timer(std::ostream& os,  const std:: string& format)  //  #6 
复制代码

 

os

其中的std::ostream指向一个输出流这就意味着可以将输出结果定位到任意输出流了如标准输出,日志文件等等

format

其中的std::string 是一个格式化字符串就如printf函数中的格式化字符串一样不过具体的格式如下:

 

%w

wall clock time指的是世界时间比如钟表的时间

%u

user time指的是用户代码执行时间 即程序在用户态时间

%s

system time指的是系统代码执行时间即程序在内核中的时间

%t

user time + system time

%p

he peacetion of the totle time in wall time程序总时间在世界时间中的百分比(由于cpu的线程切换,totle time 总是不大于wall time

 

places

places指的是保留的秒数小数点的位数,默认的是8位,超过8为的会被忽略并置为8位小于0的也会被忽略,并会被置为0

cup_timer

事实上auto_cpu_timer继承于cpu_time,但是我们在简单的情况下都是运用auto_cpu_timer的自动机制的,如果情况复杂就应该用cup_time

cup_time有三个动作:starvoid)、stopvoid)和resumevoid)分别负责从当前时间点启动计时、停止计时,和从上一个计时启动点重新开始计时。

有三个状态函数is_stopedvoid)、elapsedvoid)和format..., is_stop指示计时是否已经停止,elapsed返回当前计时以用时间但是不停止计时,format返回当前计时以用时间的字符串形式,不停止计时。

cup_timer的声明代码大致如下:

 

 

复制代码
class BOOST_TIMER_DECL cpu_timer  
    {  
       public:  
      
         //   constructor  
        cpu_timer() { start(); }  
         //   observers  
         bool        is_stopped()  const  {  return m_is_stopped; }  
        cpu_times  elapsed()  const;   //  does not stop()  
        std:: string   format( short places,  const std:: string& format)  const;  
        std:: string   format( short places = default_places)  const  
         //   actions  
         void          start();  
         void          stop();  
         void          resume();   
      
       private:  
        cpu_times     m_times;  
         bool          m_is_stopped;  
    }; 
复制代码

 其中保存时间的结构体cpu_times定义如下:

 

复制代码
typedef boost::int_least64_t nanosecond_type;  
struct cpu_times  
{
    nanosecond_type wall;  
    nanosecond_type user;  
    nanosecond_type system;  
      
     void clear() { wall = user = system = 0LL;}
}; 
复制代码

其中的boost::int_least64_t 事实上是__int64类型的

下面代码展示了cup_time的基本用法:

复制代码
#define BOOST_ALL_DYN_LINK  
#include <boost/timer/timer.hpp>  
void fun( void)  
{  
     for ( int i =  0;i <  1000;i++);  
}  
int main( void)  
{  
    boost::timer::cpu_timer timer;  
     for ( int i =  0;i <  100000;i++)  
        fun();  
    std::cout << timer.format( 5, " %ws wall time,%ts totle time\n ");  
      
    boost::timer::cpu_times time = timer.elapsed();  
    std::cout <<  " wall time is : " << time.wall <<  " ns( "   
              << time.wall/ 1000000000. 0L <<  " s) " << std::endl;  
     return  0

}

复制代码

 

boost.timer 事实上实现起来并不困难,只是由于跨平台,需要调用不同的系统 API 来得到精密的时间而已,运用 boost.timer 我们可以在大多数的 Linux/Unix 系统和 win32 系统上运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值