![Boost程序库完全开发指南:深入C++”准”标准库(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/394/31186394/b_31186394.jpg)
2.2 timer
timer可以测量时间的流逝,是一个小型的计时器,可提供毫秒级别的计时精度和操作函数,供程序员手工控制使用,它就像个秒表。
timer位于名字空间boost,需要包含的头文件如下:
#include<boost/timer.hpp>
using namespace boost;
2.2.1 用法
让我们通过一段示例代码来看一下如何使用timer。
![](https://epubservercos.yuewen.com/BABF75/16896238004365306/epubprivate/OEBPS/Images/38534_44_1.jpg?sign=1739160893-e4W12EWo1tiA1DdDrBZo92Dq5NjhzdDN-0-80520229cab2ed82c23245b299a21cf4)
上述代码基本说明了timer的接口。timer对象一旦被声明,它的构造函数就“启动”了计时工作,之后就可以随时用elapsed()函数简单地测量自对象创建后所流逝的时间。成员函数elapsed_min()用于返回timer能够测量的最小时间范围,elapsed_max()用于返回timer能够测量的最大时间范围,它们的单位都是秒。
程序的输出如下:
![](https://epubservercos.yuewen.com/BABF75/16896238004365306/epubprivate/OEBPS/Images/38534_44_2.jpg?sign=1739160893-tKgiwOcexkKxGXrJZbjKJIAlF6kagZaB-0-c1dc81f747cf0548909e73f905f2b1f3)
2.2.2 类摘要
timer非常小,全部实现(包括所有注释)也不过70余行,真正的实现代码则只有不到20行。作为我们学习的第一个Boost组件,值得把其源码全部列出来仔细研究:
![](https://epubservercos.yuewen.com/BABF75/16896238004365306/epubprivate/OEBPS/Images/38534_45_1.jpg?sign=1739160893-caXeWgDZQmXCjyYmwrUF6lGcOacNdxJW-0-90bb5cfc8d15e06f9af01287e65f16b5)
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组件。