timer
timer类可以测量时间的流逝,是一个小型的计时器,提供毫秒级别的计时精度和操作函数,供程序员手工控制使用,就像是个方便的秒表。
timer位于名字空间boost,为了使用timer组件,需要包含头文件<boost/timer.hpp>,即:
timer类可以测量时间的流逝,是一个小型的计时器,提供毫秒级别的计时精度和操作函数,供程序员手工控制使用,就像是个方便的秒表。
timer位于名字空间boost,为了使用timer组件,需要包含头文件<boost/timer.hpp>,即:
#include <boost/ timer.hpp>
using namespace boost;
用法
timer对象一旦被声明,它的构造函数就启动了计时工作,之后就可以随时用elapsed()
函数简单地测量自对象创建后所流逝的时间。成员函数elapsed_min()
返回timer
测量时间的最小精度,elapsed_max()
返回timer
能够测量的最大时间范围,两者的单位都是秒。
CLOCKS_PER_SEC
的值因操作系统而不同,在Mac OS X、Linux下是1000000,而在win32下则是1000,也就是说在Mac OS X、Linux下的精度是微秒,而Win32下的精度是毫秒。
#include <iostream>
using namespace std;
// disable pragma warning
#define BOOST_ALLOW_DEPRECATED_HEADERS
#include <boost/timer.hpp>
using namespace boost;
int main()
{
timer t; //声明一个计时器对象 开始计时
cout << CLOCKS_PER_SEC << endl; //打印精度
cout << "max timespan:" //可度量的最大时间 以小时为单位
<< t.elapsed_max() / 3600 << "h" << endl;
cout << "min timespan:" //可度量的最小时间 以秒为单位
<< t.elapsed_min() << "s" << endl;
cout << "now time elapsed:" //输出已经流逝的时间
<< t.elapsed() << "s" << endl;
}
类摘要
timer类非常小,全部实现包括所有注释也不过70余行,真正的实现代码则只有不到20行。作为我们学习的第一个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;
};
timer的计时使用了标准库头文件<ctime>
里的std::clock()
函数,它返回自进程启动以来的clock
数,每秒的clock数则由宏CLOCKS_PER_SEC
定义。
timer的构造函数记录当前的 clock
数作为计时起点,保存在私有成员变量_start_time
中。每当调用elapsed()
时就获取此时的 clock
数,减去计时起点_start_time
,再除以CLOCKS_PER_SEC
获得以秒为单位的已经流逝的时间。如果调用函数restart()
,则重置_start_time
重新开始计时。
函数elapsed_min()
返回timer能够测量的最小时间单位,是 CLOCKS_PER_SEC
的倒数。函数elapsed_max()
使用了标准库的数值极限类numeric_limits
,获得clock_t
类型的最大值,采用类似elapsed()
的方式计算可能的最大时间范围。
timer没有定义析构函数,这样做是正确且安全的。因为它仅有一个类型为clock_t
的成员变量_start_time
,故没有必要实现析构函数来特意“释放资源”(也无资源可供释放)。
使用建议
timer接口简单,轻巧好用,适用于大部分要求不高的程序计时任务。但使用时我们必须理解elapsed_min()
和elapsed_max()
这两个计时精度函数的含义,它们表明了timer的能力。
timer不适合高精度的时间测量任务,它的精度依赖于操作系统或编译器,难以做到跨平台。timer也不适合大跨度时间段的测量,如果需要以天、月甚至年作为时间的单位则不能使用timer。
参考文献
https://download.csdn.net/download/qq_36314864/87796984