• C++11 标准库也有坑(time-chrono)


        恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time()   只能取到秒(win和linux)

    想试试看能不能找到 至少可以取到毫秒的, 于是, 就找到 了 c++11 标准库:  std::chrono

    然后做了实验, 测试了下,代码如下

    1. windows版:

     View Code

    输出如下:

    t1=str2stmp(nullptr)             =1489397303
    t2=str2stmp("2017-3-13 15:26:29")=1489389989
    t3=stmp2str(t1)                  =2017-03-13 17:28:23
    t4=stmp2str(t2)                  =2017-03-13 15:26:29
    
    t4=stmp2str(tt1)                 =2017-03-13 17:28:23  14893973035294

    2. linux版

     View Code

    输出结果:

    t1=str2stmp(nullptr)             =1489397692
    t2=str2stmp("2017-3-13 15:26:29")=1489389989
    t3=stmp2str(t1)                  =2017-03-13 17:34:52
    t4=stmp2str(t2)                  =2017-03-13 15:26:29
    
    t4=stmp2str(tt1)                 =2017-03-13 17:34:52  1489397692249265

    3. 差异

    两个版本的代码仅仅只是标红的地方的差异, 但也就是这个差异说明:

    std::chrono::system_clock::now().time_since_epoch().count()
    在 windows 下 和 linux 下 取到的 时间精度 很不一样啊, windows下 居然 位数都不对, 比linux 下 少两位数

    请注意 是两位, 纳秒->微秒->毫秒,哪个精度的进制是10的?  难道不是1000吗?

      

    4. 解决办法

    getTimeStamp() 函数这样搞

    1 std::time_t getTimeStamp()
    2 {
    3     std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
    4     return tp.time_since_epoch().count();
    5 }

    5. 原因

    见鬼的原因是:

    windows系统的测试结果是system_clock的精度是100纳秒,而high_resolution的精度是1纳秒。

    测试方法:

     1 #include <iostream>  
     2 #include <chrono>  
     3 using namespace std;  
     4 int main()  
     5 {  
     6     cout << "system clock          : ";  
     7     cout << chrono::system_clock::period::num << "/" << chrono::system_clock::period::den << "s" << endl;  
     8     cout << "steady clock          : ";  
     9     cout << chrono::steady_clock::period::num << "/" << chrono::steady_clock::period::den << "s" << endl;  
    10     cout << "high resolution clock : ";  
    11     cout << chrono::high_resolution_clock::period::num << "/" << chrono::high_resolution_clock::period::den << "s" << endl;  
    12     system("pause");  
    13     return 0;  
    14 }

    chrono中有三种时钟:system_clock,steady_clock和high_resolution_clock。每一个clock类中都有确定的time_point, duration, Rep, Period类型。

    system_clock是不稳定的。因为时钟是可调的,即这种是完全自动适应本地账户的调节。这种调节可能造成的是,首次调用now()返回的时间要早于上次调用now()所返回的时间,这就违反了节拍频率的均匀分布。稳定闹钟对于超时的计算很重要,所以C++标准库提供一个稳定时钟 std::chrono::steady_clock。std::chrono::high_resolution_clock 是标准库中提供的具有最小节拍周期(因此具有最高的精度的时钟)。

    上文所说time_since_epoch(),以及将要介绍的now()函数的返回值都依赖于时钟的精度。

     详细说明见:  c++11 chrono全面解析(最高可达纳秒级别的精度)

  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/lzpong/p/6544117.html
Copyright © 2020-2023  润新知