C++11 中提供了一个计时的标准库 <chrono>;
里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;

区别

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

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

// 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 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

  1. 尽量不要使用 count() 方法
  2. 尽量不要使用 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 the types, 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);

参考

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

C++ chrono 库中的 steady_clock 、 system_clock、high_resolution_clock区别相关推荐

  1. python自带的sum()函数和numpy库中的sum()函数的区别

    在学习<机器学习实战>一书的第十章时,对 return np.sqrt(sum(np.power(vecA - vecB, 2))) 这样一条语句输出的结果老是不对,明明想要输出的是对两个 ...

  2. C++标准库中sstream和strstream的区别

    在C++有两种字符串流,一种在sstream中定义, 另一种在strstream中定义. 它们实现的东西基本一样. strstream里包含 class strstreambuf; class ist ...

  3. c++ stl库中begin()和end()的区别

    c.begin();           返回指向容器最开始位置数据的指针 c.end();             返回指向容器最后一个数据单元+1的指针 如果我们要输出最后一个元素的值应该是 *( ...

  4. contourf参数 python_matplotlib.pyplot可视化库中contour与contourf的区别

    contour做的云图不是填充的,而contourf画的云图是填充的 来两个例子一目了然,代码可用.(本文例子来自matplotlib管网) contour函数 contour([X, Y,] Z, ...

  5. (笔记)处理日期和时间的方法(chrono 库,time_t等)

    文章目录 0 摘要 1 chrono 库 1.1 时间间隔duration 1.2 时间点time point 1.3 时钟clocks 1.3.1 system_clock 1.3.2 steady ...

  6. C++处理日期和时间的chrono库

    C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利.chrono 库主要包含三种类型的类:时间间隔duration.时钟cl ...

  7. C++ 使用 chrono 库处理日期和时间

    C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利.chrono 库主要包含三种类型的类:时间间隔duration.时钟cl ...

  8. 处理日期和时间的 chrono 库

    C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利.chrono 库主要包含三种类型的类:时间间隔duration.时钟cl ...

  9. C++11库中 steady_clock , system_clock和high_resolution_clock的区别

    C++11 中提供了一个计时的标准库 <chrono>; 里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock ...

最新文章

  1. 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法
  2. 阿帕奇搭建文件服务器,关于LINUX文件服务器简单搭建---NFS与APACHE服务
  3. Post和Get差异
  4. abap 生成流水号每天从1开始_条码软件如何制作循环流水号
  5. 在应用程序级别以外使用注册为 allowDefinition='MachineToApplication' 的节是错误
  6. VSTO 得到Office文档的选中内容(Word、Excel、PPT、Outlook)
  7. mysql引号注入_MySql注入
  8. Git忽略项目中的指定的文件
  9. 在社会上闯荡必须要牢记的
  10. SPSS下载安装教程
  11. Go语言实战的知识图谱
  12. c语言教材系统管理课设
  13. 数据结构试卷及答案(四)
  14. H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
  15. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)...
  16. 如何解决算百分比,加起来不是100%的问题
  17. 关于荧光染料(FITC、RB罗丹明、Cy3,Cy3.5,Cy5,Cy5.5,Cy7,Cy7.5)
  18. 软考高级-信息系统管理师之综合测试与管理(最新版)
  19. Mathematica 作图详解
  20. 计算机用户被禁用,administrator账户被停用怎么办【图文教程】

热门文章

  1. c 语言 模板函数,函数模板特化
  2. linux安装java的脚本吗,Linux安装JDK脚本
  3. unity2018关联不到vs_原尚股份VS.长久物流,整车物流和零部件物流,谁才是好生意?...
  4. stm32 usb 虚拟串口 相同_为什么说你要学习USB?(一)
  5. python开发小型数据库_Python开发【第十七篇】:MySQL(一)
  6. Docker两个问题的讨论
  7. 洛谷 3953 NOIP2017提高组Day1 T3 逛公园
  8. Python模拟Linux的Crontab, 写个任务计划需求
  9. 高级Bash脚本编程指南《Advanced Bash-Scripting Guide》 in Chinese
  10. nodejs+vue.js+webpack