• 计时函数(二)


    计时函数(二)

    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>

  • 相关阅读:
    [转] Java 基础
    IDEA 入门
    如何将本地的一个新项目上传到GitHub上新建的仓库中去
    多线程学习
    Java泛型中E、T、K、V等的含义
    数据结构
    5W1H
    mysql语句sum求和为null的问题
    java 开发体系参考学习
    linux下发邮件
  • 原文地址:https://www.cnblogs.com/jerry19880126/p/2919718.html
Copyright © 2020-2023  润新知