2.2 timer

timer可以测量时间的流逝,是一个小型的计时器,可提供毫秒级别的计时精度和操作函数,供程序员手工控制使用,它就像个秒表。

timer位于名字空间boost,需要包含的头文件如下:

#include<boost/timer.hpp>

using namespace boost;

2.2.1 用法

让我们通过一段示例代码来看一下如何使用timer在这里main()函数结尾没有return 0语句,这是符合C++标准的(但不符合C标准),本书之后的例子也都将使用这种形式。

上述代码基本说明了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定义CLOCKS_PER_SEC的值因操作系统的不同而不同,在macOS、Linux操作系统下其值是1'000'000,而在Windows操作系统下其值则是1'000,也就是说其值在macOS、Linux操作系统下的精度是微秒,而在Windows操作系统下的精度是毫秒。

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组件。