C++11 标准库也有坑(time-chrono)
恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time() 只能取到秒(win和linux)
想试试看能不能找到 至少可以取到毫秒的, 于是, 就找到 了 c++11 标准库: std::chrono
然后做了实验, 测试了下,代码如下
1. windows版:
输出如下:
t1=str2stmp(nullptr) =
t2=str2stmp("2017-3-13 15:26:29")=
t3=stmp2str(t1) =-- ::
t4=stmp2str(t2) =-- :: t4=stmp2str(tt1) =-- ::
2. linux版
输出结果:
t1=str2stmp(nullptr) =
t2=str2stmp("2017-3-13 15:26:29")=
t3=stmp2str(t1) =-- ::
t4=stmp2str(t2) =-- :: t4=stmp2str(tt1) =-- ::
3. 差异
两个版本的代码仅仅只是标红的地方的差异, 但也就是这个差异说明:
std::chrono::system_clock::now().time_since_epoch().count()
在 windows 下 和 linux 下 取到的 时间精度 很不一样啊, windows下 居然 位数都不对, 比linux 下 少两位数
请注意 是两位, 纳秒->微秒->毫秒,哪个精度的进制是10的? 难道不是1000吗?
4. 解决办法
getTimeStamp() 函数这样搞
std::time_t getTimeStamp()
{
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());
return tp.time_since_epoch().count();
}
5. 原因
见鬼的原因是:
windows系统的测试结果是system_clock的精度是100纳秒,而high_resolution的精度是1纳秒。
测试方法:
#include <iostream>
#include <chrono>
using namespace std;
int main()
{
cout << "system clock : ";
cout << chrono::system_clock::period::num << "/" << chrono::system_clock::period::den << "s" << endl;
cout << "steady clock : ";
cout << chrono::steady_clock::period::num << "/" << chrono::steady_clock::period::den << "s" << endl;
cout << "high resolution clock : ";
cout << chrono::high_resolution_clock::period::num << "/" << chrono::high_resolution_clock::period::den << "s" << endl;
system("pause");
return ;
}
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全面解析(最高可达纳秒级别的精度)
C++11 标准库也有坑(time-chrono)的更多相关文章
- 11. 标准库浏览 – Part II
第二部分包含了支持专业编程工作所需的更高级的模块,这些模块很少出现在小脚本中. 11.1. 输出格式 reprlib 模块为大型的或深度嵌套的容器缩写显示提供了 :repr() 函数的一个定制版本: ...
- C++11标准库中cstdio头文件新增的5个格式化I/O函数学习
刚开始学网络编程,稍微扩展书上的简单C/S程序时,发现以前太忽略标准I/O这一块,查官网发现C++11新增了几个格式化I/O函数. snprintf 将格式化输出写入到有大小限制的缓存中 vfs ...
- C++11 标准库 bind 函数
bind 是什么? bind 顾名思义: 绑定 通俗来讲呢,可以这么理解有点像函数指针的意思. 资料上是这么讲的:可以将 bind 函数看做一个通用函数的适配器,它接受一个可调用对象,生成一个新的可以 ...
- C++标准库第二版笔记 1
C++标准库第二版笔记 1 C++ std历史 第一份标准化文档: C++98 & C++03 & TR1 TR1 Information Technology- Programmin ...
- 标准库中的智能指针shared_ptr
智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...
- c++ 11开始语言本身和标准库支持并发编程
c++ 11开始语言本身和标准库支持并发编程,意味着真正要到编译器从语言和标准库层面开始稳定,估计得到17标准出来.14稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...
- Python标准库笔记(11) — Operator模块
Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...
- 【循序渐进学Python】11.常用标准库
安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...
- Boost程序库完全开发指南——深入C++“准”标准库(第3版)
内容简介 · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...
随机推荐
- DEDECMS万能标签{dede:sql}使用教程详解
http://www.dede58.com/a/dedebq/2015/0226/1737.html 1.首页在后台单页文档管理里添加一个单页文档,内容编辑框输入你要的内容生成. 2.在需要调用单页文 ...
- DOS基本命令(基本部分)
一.cls(clear screen的简写) 命令作用:清屏屏幕 详细介绍:屏幕显示的所有字符信息都是存放在一个屏幕缓冲区中,cls命令的作用是清除屏幕上的文字,并将该缓冲区清空. 二.dir(dir ...
- BOM基础知识
1.什么是BOM BOM(Browser Object Document)即浏览器对象模型. BOM提供了独立于内容 而与浏览器窗口进行交互的对象: 由于BOM主要用于管 ...
- 关于RegExp对象实例的lastIndex属性的一些整理
今天在做正则循环匹配,碰到一个怪问题,第一次可以匹配上,但循环第一次之后,就无法匹配上了.猛然想起,RegExp中lastIndex属性,于是上网搜索了一下,将一些资料整理归纳,以备今后自己查阅(记性 ...
- docker 安装NexusRepository Manager
今天学习了一下docker 感觉这东西要学习好多的命令,但是自己又是喜欢这种命令,感觉linux总是高一个等级的东西,这几天学习使用docker安装各种东西,下面记录一些我安装nexus的步骤,还是不 ...
- mydate97设置时间
1.引入包 2.页面引入 <script type="text/javascript" src="${pageContext.request.contextPath ...
- Linux实践篇--linux软件的安装,更新与卸载
本文出处:http://www.cnblogs.com/lhj588/archive/2012/07/17/2595328.html,感谢作者分享. Linux常见的安装为tar,zip,gz,rpm ...
- JAVA中使用log4j及slf4j进行日志输出的方法详解
JAVA中输出日志比较常用的是log4j,这里讲下log4j的配置和使用方法,以及slf4j的使用方法. 一.下载log4j的架包,并导入项目中,如下: 二.创建log4j.properties配置 ...
- 让Python支持中文注释
在第一行中加入如下行即可,表示文件的编码: #coding=utf-8 或 #coding=gbk
- tomcat监控(二)
标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 这里介绍二种监控Tomcat的方法 使用windows版本的jdk监控 使用zabbix监控 ...