• C++ 11 chrono


    chrono

    目录

    chrono

    Abstract

    duration

    Abstract

    How

    Demo

    time_point

    Abstract

    How

    Demo

    Clock

    Abstract

    How

    Demo

    Template


    Abstract

    c++11关于时间引入了chrono库,源于boost,功能强大,chrono主要有三个点:

    • duration
    • time_point
    • clocks

    duration

    Abstract

    duration表示一段时间间隔

    template> 
     class duration

    Rep是一个数值类型,表示时钟个数,Period表示每个时钟周期的秒数。Period的默认模板参数是std::ratio

    template 
    class ratio

    Num代表分子,Denom代表分母。ratio<1>代表一个时钟周期是一秒,ratio<60>代表了一分钟,ratio<60*60>代表一个小时,ratio<1, 1000>代表一毫秒,ratio<1, 1000000>代表一微秒,ratio<1, 1000000000>代表一纳秒。

    How

    typedef duration > hours; 
    typedef duration > minutes;
    typedef duration > seconds;
    typedef duration > milliseconds;          //毫秒
    typedef duration > microseconds;       //微秒
    typedef duration > nanoseconds;     //纳秒

    Demo

    #include 
    #include 
    #include 
    using namespace std;
    int main()
    {
        this_thread::sleep_for(chrono::seconds(3));        //休眠3秒
        this_thread::sleep_for(chrono::milliseconds(100)); //休眠100毫秒
        cout << "Hello" << endl;
        getchar();
        return 0;
    }

    time_point

    Abstract

    描述的是一个具体的时间点

    原型是:

    template
    class time_point

    这里的duration 就是上面提到的,Clock之后会介绍。

    How

     time_point h = time_point_cast(system_clock::now());

    Demo

    #include 
    #include 
    using namespace std;
     
    int main()
    {
        using namespace std::chrono;
        time_point h = time_point_cast(system_clock::now());
        cout << h.time_since_epoch().count() << " hours since epoch" << endl;
        getchar();
        return 0;
    }

    Clock

    Abstract

    clocks表示当前的系统时钟,内部有time_point, duration, Rep, Period等信息。

    clocks包含三种时钟:

    steady_clock 是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时;

    system_clock 是系统的时钟;因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。

    high_resolution_clock 是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。

    How

    steady_clock

    稳定的时间间隔,表示相对时间,相对于系统开机启动的时间,无论系统时间如何被更改,后一次调用now()肯定比前一次调用now()的数值大,可用于计时。

    相当于教练手中的秒表;只会增长,适合用于记录程序耗时.

    system_clock

    表示当前的系统时钟,可以用于获取当前时间

    high_resolution_clock

    high_resolution_clock表示系统可用的最高精度的时钟,实际上就是system_clock或者steady_clock其中一种的定义,官方没有说明具体是哪个,不同系统可能不一样,我之前看gcc chrono源码中high_resolution_clock是steady_clock的typedef。

    Demo

    // copied from http://www.informit.com/articles/article.aspx?p=1881386&seqNum=2;
     
    // Author: Nicolai M. Josuttis
     
     
    #include 
     
    #include 
     
    #include 
     
     
    template 
     
    void printClockData ()
     
    {
     
    using namespace std;
     
     
    cout << "- precision: ";
     
    // if time unit is less or equal one millisecond
     
    typedef typename C::period P;// type of time unit
     
    if (ratio_less_equal::value) {
     
    // convert to and print as milliseconds
     
    typedef typename ratio_multiply::type TT;
     
    cout << fixed << double(TT::num)/TT::den
     
    << " milliseconds" << endl;
     
    }
     
    else {
     
    // print as seconds
     
    cout << fixed << double(P::num)/P::den << " seconds" << endl;
     
    }
     
    cout << "- is_steady: " << boolalpha << C::is_steady << endl;
     
    }
     
     
    int main()
     
    {
     
    std::cout << "system_clock: " << std::endl;
     
    printClockData();
     
    std::cout << "\nhigh_resolution_clock: " << std::endl;
     
    printClockData();
     
    std::cout << "\nsteady_clock: " << std::endl;
     
    printClockData();
     
     
    #ifdef _WIN32
     
    system("pause");
     
    #endif
     
    return 0;
     
    }
     
     
    system_clock:
     
    - precision: 0.000100 milliseconds
     
    - is_steady: false
     
     
    high_resolution_clock:
     
    - precision: 0.000001 milliseconds
     
    - is_steady: true
     
     
    steady_clock:
     
    - precision: 0.000001 milliseconds
     
    - is_steady: true

    Template

    #include 
    
    #define TIMERSTART(tag)  auto tag##_start = std::chrono::steady_clock::now(),tag##_end = tag##_start
    #define TIMEREND(tag)  tag##_end =  std::chrono::steady_clock::now()
    #define DURATION_s(tag) printf("%s costs %d s\n",#tag,std::chrono::duration_cast(tag##_end - tag##_start).count())
    #define DURATION_ms(tag) printf("%s costs %d ms\n",#tag,std::chrono::duration_cast(tag##_end - tag##_start).count());
    #define DURATION_us(tag) printf("%s costs %d us\n",#tag,std::chrono::duration_cast(tag##_end - tag##_start).count());
    #define DURATION_ns(tag) printf("%s costs %d ns\n",#tag,std::chrono::duration_cast(tag##_end - tag##_start).count());
    
    
    // usage:
    //   TIMERSTART(for_loop);
    //   for (int i = 0; i < 100000; i++)
    //   {
    //       i*i;
    //   }
    //   TIMEREND(for_loop);
    //   DURATION_ms(for_loop);
    
  • 相关阅读:
    【前端】NodeJS:包管理工具
    简述使用vue使用webpack脚手架创建项目并升级至webpack4
    API接口接入1688电商数据平台获取商品详情数据示例
    SpringBoot+MinIO8.0开箱即用的启动器
    .Net学习——Linq常用拓展方法使用
    计算机毕业设计之java+springboot基于vue的广场舞团社团网站-社团管理系统
    linux安装kafka
    字节也开始缩招了...
    C++——list的模拟实现
    【宋红康 MySQL数据库 】【高级篇】【19】多版本并发控制MVCC
  • 原文地址:https://blog.csdn.net/qq_32378713/article/details/126289790