chrono
目录
Abstract
c++11关于时间引入了chrono库,源于boost,功能强大,chrono主要有三个点:
- duration
- time_point
- clocks
duration
Abstract
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>代表一纳秒。
How
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; //纳秒
Demo
#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; }
time_point
Abstract
描述的是一个具体的时间点
原型是:
template<class _Clock, class _Duration = typename _Clock::duration> class time_point
这里的duration 就是上面提到的,Clock之后会介绍。
How
time_point<system_clock, hours> h = time_point_cast<hours>(system_clock::now());
Demo
#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; }
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 <chrono> #include <iostream> #include <iomanip> template <typename C> 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<P,milli>::value) { // convert to and print as milliseconds typedef typename ratio_multiply<P,kilo>::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::chrono::system_clock>(); std::cout << "\nhigh_resolution_clock: " << std::endl; printClockData<std::chrono::high_resolution_clock>(); std::cout << "\nsteady_clock: " << std::endl; printClockData<std::chrono::steady_clock>(); #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 <chrono> #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<std::chrono::seconds>(tag##_end - tag##_start).count()) #define DURATION_ms(tag) printf("%s costs %d ms\n",#tag,std::chrono::duration_cast<std::chrono::milliseconds>(tag##_end - tag##_start).count()); #define DURATION_us(tag) printf("%s costs %d us\n",#tag,std::chrono::duration_cast<std::chrono::microseconds>(tag##_end - tag##_start).count()); #define DURATION_ns(tag) printf("%s costs %d ns\n",#tag,std::chrono::duration_cast<std::chrono::nanoseconds>(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);