zoukankan      html  css  js  c++  java
  • 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全面解析(最高可达纳秒级别的精度)

  • 相关阅读:
    【原创】基于Altera DE2的数字实验—001_1 (DE2)(Digital Logical)(Verilog)
    【笔记】Excel技巧—012 隔行插入
    【笔记】Excel技巧016使用语音校验输入准确性
    【翻译】Nios design contest 2007001
    【笔记】Excel技巧—014 多窗口协同作业
    【笔记】Excel技巧—013 方便查看标题的“冻结窗格”功能
    【翻译】Nios II处理器简介 (Nios II)
    【笔记】Excel技巧—011 改变工作表标签颜色与字号
    【原创】DE2实验解答—lab7 (Quartus II)(Digital Logic)(Verilog HDL)
    【笔记】Linux基础—001 安装CentOS5.6
  • 原文地址:https://www.cnblogs.com/lzpong/p/6544117.html
Copyright © 2011-2022 走看看