计时函数(二)
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>