2.2 timer
timer可以测量时间的流逝,是一个小型的计时器,可提供毫秒级别的计时精度和操作函数,供程序员手工控制使用,它就像个秒表。
timer位于名字空间boost,需要包含的头文件如下:
#include<boost/timer.hpp>
using namespace boost;
2.2.1 用法
让我们通过一段示例代码来看一下如何使用timer。
上述代码基本说明了timer的接口。timer对象一旦被声明,它的构造函数就“启动”了计时工作,之后就可以随时用elapsed()函数简单地测量自对象创建后所流逝的时间。成员函数elapsed_min()用于返回timer能够测量的最小时间范围,elapsed_max()用于返回timer能够测量的最大时间范围,它们的单位都是秒。
程序的输出如下:
2.2.2 类摘要
timer非常小,全部实现(包括所有注释)也不过70余行,真正的实现代码则只有不到20行。作为我们学习的第一个Boost组件,值得把其源码全部列出来仔细研究:
timer的计时使用了标准库头文件<ctime>里的std::clock()函数,它返回自进程启动以来的clock数,每秒的clock数则由宏CLOCKS_PER_SEC定义。
timer的构造函数记录当前的clock数作为计时起点,并将其保存在私有成员变量_start_time中。每当调用elapsed()时就会获取此时的clock数,用clock数减去计时起点,再除以CLOCKS_PER_SEC可以获得已经流逝的时间(以秒为单位)。如果调用函数restart(),则重新开始计时。
函数elapsed_min()返回timer能够测量的最小时间单位,是CLOCKS_PER_SEC的倒数。函数elapsed_max()使用了标准库的数值极限类numeric_limits,获得clock_t类型的最大值,该函数采用类似elapsed()的方式计算能够测量的最大时间范围。
timer没有定义析构函数,这样做是正确且安全的。因为它仅有一个类型为clock_t的成员变量_start_time,故没有必要实现析构函数来特意释放资源(事实上,也无资源可供释放)。
2.2.3 使用建议
timer接口简单好用,适用于大部分要求不高的程序计时任务。但在使用timer时我们必须理解elapsed_min()和elapsed_max()这两个计时精度函数的含义,它们表明了timer的能力。
timer不适用于高精度的时间测量任务,它的精度依赖操作系统或编译器,难以做到跨平台。timer也不适用于测量大跨度时间段,如果需要以天、月,甚至年为时间单位则不能使用timer,应使用10.3节讲解的cpu_timer组件。