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

时间:2023-01-30 19:31:29

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

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

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

1. windows版:

 C++11 标准库也有坑(time-chrono)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版

 C++11 标准库也有坑(time-chrono)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() 函数这样搞

C++11 标准库也有坑(time-chrono)C++11 标准库也有坑(time-chrono)
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 }
View Code

 

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全面解析(最高可达纳秒级别的精度)