失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C++ chrono 库中的 steady_clock system_clock high_resolution_clock区别

C++ chrono 库中的 steady_clock system_clock high_resolution_clock区别

时间:2020-11-04 06:04:50

相关推荐

C++ chrono 库中的 steady_clock   system_clock high_resolution_clock区别

C++11 中提供了一个计时的标准库<chrono>;

里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;

区别

steady_clock 是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时;system_clock 是系统的时钟;因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。high_resolution_clock 是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。

在 参考链接[2] 中提供了代码,可以查看自己的机器上三种时钟的时间精度。

// copied from /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 millisecondtypedef typename C::period P;// type of time unitif (ratio_less_equal<P,milli>::value) {// convert to and print as millisecondstypedef typename ratio_multiply<P,kilo>::type TT;cout << fixed << double(TT::num)/TT::den<< " milliseconds" << endl;}else {// print as secondscout << 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 _WIN32system("pause");#endifreturn 0;}system_clock:- precision: 0.000100 milliseconds- is_steady: falsehigh_resolution_clock:- precision: 0.000001 milliseconds- is_steady: truesteady_clock:- precision: 0.000001 milliseconds- is_steady: true

建议

以下是 stackoverflow 上一个大佬给出的建议difference between steady clocl vs system clock

尽量不要使用count()方法尽量不要使用time_since_epoch()

理由是:提供了类型安全的机制防止用户进行单位换算的时候出错;但是这两个函数是例外的,起到“紧急出口的作用”,

Such emergencies arise when (for example) the committee neglects to give you all the tools you need to get the job done (such as I/O) for thetypes, or such as the need to interface with some other timing API via integers

在I/O 或者与其他 通过整数传参数的时间函数接口中使用。

使用方法

例子:一个用来测试代码段运行时间的宏

#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);

参考

c++ - Difference between steady_clock vs system_clock? - Stack OverflowC++ Stardard Library:A Tutorial and Reference, 2nd Edition

如果觉得《C++ chrono 库中的 steady_clock system_clock high_resolution_clock区别》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。