计时函数(二)

计时函数(二)

boost库中提供了更精确计时函数,这是因为其所包含了date_time库中提供了秒和微秒的时钟。

下面分成两部分,第一部分介绍boost库的配置,第二部分介绍如何获得微秒级的计时。

 

第一部分:boost库的配置

从 www.boost.org 中下载boost函数库,里面有个HTML形式的帮助文档,打开index.htm或者index.html即可看到分层别类的帮助信息。阅读帮助文档是学习新知识最直接最方便的方法。

date_time需要编译才能使用其完整功能(不编译其实也行,只是每次编译器都会对包含的头文件进行编译,速度相对于已经编译好的文件而言会慢一些),编译方法如下:

1. 运行bootstrap.bat,生成bjam.exe和b2.exe这两个文件本质是一样的,只是bjam.exe比较陈旧一些;

2. 选择部分编译:

打开命令行,进入到b2.exe所在的目录

然后在命令行下输入b2 --with-date_time

3. 编译出的库文件在stage文件夹下

 

接下来修改Visual Studio中的设置,下面给出帮助文档中的截图:

编译设置

链接设置

第二部分:date_time库计时函数的使用

date_time提供了秒时钟和微秒时钟,分别可以精确到秒和微秒,代码如下:

 1 //#define BOOST_DATE_TIME_SOURCE
 2 #include <iostream>
 3 #include <boost/date_time/gregorian/gregorian.hpp>
 4 #include <boost/date_time/posix_time/posix_time.hpp>
 5 using namespace std;
 6 using namespace boost::gregorian;
 7 using namespace boost::posix_time;
 8 
 9 /************************************************************************/
10 /*
11 创建微秒级的计时器
12 */
13 /************************************************************************/
14 
15 template <class T = microsec_clock>
16 class MyTimer
17 {
18 private:
19     ptime m_startTime;
20 
21 public:
22     MyTimer()
23     {
24         Restart();
25     }
26 
27     void Restart()
28     {
29         m_startTime = T::local_time();
30     }
31 
32 
33     void Elapsed()
34     {
35         cout << T::local_time() - m_startTime << endl;
36     }
37 };
38 
39 
40 int main()
41 {
42     MyTimer<microsec_clock> t;
43     for(int i = 0; i < 100; ++i)
44     {
45         cout << "hello" << endl;
46     }
47     t.Elapsed();
48 }

不要忘记头文件和命名空间的添加,第一行被注释掉的宏

#define BOOST_DATE_TIME_SOURCE

若启用这个宏定义,则默认由编译器重新编译嵌入的头文件;若不启用这个宏定义,则表示使用系统已编译好的date_time库。若你已经完成了第一部的编译工作,则可以不启用这个宏。

重点来看自定义的这个类,它有一个私有的成员变量,类型是ptime,ptime在date_time库中表示时间点(囊括年、月、日、时、分、秒、微秒或纳秒),因为这里用于计时,所以只使用其时、分、秒、微秒或纳秒的部分。在构造函数里调用了成员函数Restart(),而在Restart()中则调用了时钟的local_time()函数,这里使用了类型的泛型,date_time库中提供了秒与微秒的时钟,这里泛型默认取的是microsec_clock,即微秒计时器。成员函数Elapsed()则输出两个时点的时间差,也就实现了计时的功能,精度可以到微秒。

main()函数运行的测试结果如下:

 

可以看到,本次运行用时0.0625s,也即62.5ms。另一方面,可以看到小数点后面有6个0,精确到秒的后6位,也就是微秒。这样就成功实现了微秒级的计时。

 

<end>

 

posted @ 2013-02-20 21:56  Jerry19880126  阅读(2438)  评论(0编辑  收藏  举报