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 }
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全面解析(最高可達納秒級別的精度)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM