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