C++中Duration、Time_point和Clocks

    C++11中的chrono库,实现时间相关的功能。

1.duration

    duration表示一段时间间隔,原型是:

 template<class Rep, class Period = std::ratio<1>> 
 class duration

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

template<std::intmax_t Num, std::intmax_t Denom = 1> 
class ratio

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

    标准库定义了一些常用的时间间隔,如下:

typedef duration <Rep, ratio<3600,1>> hours; 
typedef duration <Rep, ratio<60,1>> minutes;
typedef duration <Rep, ratio<1,1>> seconds;
typedef duration <Rep, ratio<1,1000>> milliseconds;          //毫秒
typedef duration <Rep, ratio<1,1000000>> microseconds;       //微秒
typedef duration <Rep, ratio<1,1000000000>> nanoseconds;     //纳秒

    实例程序如下:

#include <iostream>
#include <chrono>
#include <thread>
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;
}

2.time_point

    time_point表示一个时间点,原型是:

template<class _Clock, class _Duration = typename _Clock::duration>
class time_point

   函数time_since_epoch()用来获取1970.1.1以来的时间。下面实例获取当前到1970.1.1有多少小时。

#include <iostream>
#include <chrono>
using namespace std;

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

3.clocks

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

    clocks包含三种时钟: 

  • system_clock:从系统获取的时钟;
  • steady_clock:不能被修改的时钟;
  • high_resolution_clock:高精度时钟

    实例测试这些属性

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;

int main() {
    cout << "system_clock" << endl;
    cout << system_clock::period::num << endl;
    cout << system_clock::period::den << endl;
    cout << "steady = " << boolalpha << system_clock::is_steady << endl;
    cout << "------------------------------ " << endl;
    cout << "high_resolution_clock" << endl;
    cout << high_resolution_clock::period::num << endl;
    cout << high_resolution_clock::period::den << endl;
    cout << "steady = " << boolalpha << high_resolution_clock::is_steady << endl;
    cout << "------------------------------ " << endl;
    cout << "steady_clock" << endl;
    cout << steady_clock::period::num << endl;
    cout << steady_clock::period::den << endl;
    cout << "steady = " << boolalpha << steady_clock::is_steady << endl;

    getchar();
    return 0;
}

    测试结果(Windows 10上,Visual Studio 2017编译)

system_clock
1
10000000
steady = false
------------------------------
high_resolution_clock
1
1000000000
steady = true
------------------------------
steady_clock
1
1000000000
steady = true

     system_clock是微秒精度且可调整,steady_clock和high_resolution_clock是纳秒精度不可调整。

     实例测试一段代码的执行时间。

#include <iostream>
#include <chrono>
using namespace std;
int main()
{
    using namespace std::chrono;
    steady_clock::time_point t1 = steady_clock::now();
    cout << "Hello World\n";
    steady_clock::time_point t2 = steady_clock::now();
    cout << duration <double, milli>(t2 - t1).count() << " tick count" << endl;
    getchar();
    return 0;
}
发布了515 篇原创文章 · 获赞 135 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/liyazhen2011/article/details/103677213
今日推荐