一、概述
一直以来,C++对时间的处理都不是很理想,而且时间和日期在工作中又是我们经常遇到的,故而我们只能求助于C语言的笨拙的函数。而boost库却完美地使用timer,date_time和chrono解决了这个问题。本文我们只介绍timer类。
二、timer类的源码解析
以下是boost_1_63_0版本中的timer类的去除注释、去除掉注释掉的代码的源码
#ifndef BOOST_TIMER_HPP
#define BOOST_TIMER_HPP
#include <boost/config.hpp>
#include <ctime>
#include <boost/limits.hpp>
# ifdef BOOST_NO_STDC_NAMESPACE
namespace std { using ::clock_t; using ::clock; }
# endif
namespace boost {
class timer
{
public:
timer() { _start_time = std::clock(); }
void restart() { _start_time = std
::clock(); }
double elapsed() const
{ return double(std::clock() - _start_time) / CLOCKS_PER_SEC; }
double elapsed_max() const
{
return (double((std::numeric_limits<std::clock_t>::max)())
- double(_start_time)) / double(CLOCKS_PER_SEC);
}
double elapsed_min() const
{ return double(1)/double(CLOCKS_PER_SEC); }
private:
std::clock_t _start_time;
};
}
#endif
timer计时器使用了标准头文件<ctimer>里的clock()函数,这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。每秒的clock由宏CLOCKS_PER_SEC定义。
timer()构造函数以当前的clock数作为计时起点,保存到私有成员变量:_start_time中;restart()则重置_start_time重新开始计时;elapsed()这个函数的作用是获取以秒为单位的已经流失的时间。
elapsed_max()使用了标准库中的极限类numeric_limits,返回时间的最大值。
elapsed_min()返回timer能够测量的最小时间单位,是CLOCKS_PER_SEC的倒数。
三、该类的使用小案例
#include <iostream>
#include <boost/timer.hpp>
using namespace boost;
using namespace std;
int main()
{
timer t;
cout << "elapsed() = " << t.elapsed() << "秒" << endl;
cout << "elapsed_min() = " << t.elapsed_min() << "秒" << endl;
cout << "elapsed_max() = " << t.elapsed_max() << "时" << endl;
return 0;
}
执行结果如下
四、总结
我们都可以看到,timer类中并没有析构函数,原因很简单,因为_start_time仅仅是个clock_t类型的成员变量,根本就没有资源可以释放。timer类的精度依赖于操作系统或者编译器,因此它并不适合高精度的时间测量,同时也难以做到跨平台。
本文介绍了 Boost 库中的 Timer 类,详细解析了其源码,并通过一个简单案例展示了如何使用 Timer 类来测量时间。Timer 类使用标准 C 库中的 clock 函数来记录 CPU 时间,适用于一般精度的时间测量。
1609

被折叠的 条评论
为什么被折叠?



