浅尝boost之timer
我一直是在努力推介boost,因为boost是一块美玉,但,没有什么是完美的。现在,我将暴露出boost的一点瑕疵:boost::timer。虽说是瑕不掩瑜,但瑕疵就是瑕疵。先看一看下面的例子:
boost::timer t;
Sleep(1000);
cout << t.elapsed() << endl;
// redhat9 中gcc3.2.3编译运行
boost::timer t;
sleep(1);
cout << t.elapsed() << endl;
他们的结果是一样吗?不同的操作系统,时钟精度是不一样,结果自然不完全一样;但我说的不一样不是这一点小小的差异,而是在redhat9上t.elapsed()返回的竟然是 0 。boost::progress_timer也有同样问题,为什么 ?
boost::timer是一个clock()的非常简单的封装,简单到我不认为有理由存在于boost之样的库之中。基本只是下面的东西
{
public:
timer() { _start_time = clock(); }
void restart() { _start_time = clock(); }
double elapsed() const{ return double(clock() - _start_time) / CLOCKS_PER_SEC; }
private:
clock_t _start_time;
}; // timer
所以抛开boost::timer这层包装来看,就是clock与sleep之间的问题了。为什么不用sleep就可以得到流逝的时间呢(cin.get()也不能得到)。推其原因在于linux平台上sleep时,clock是获得CPU被使用的时间。而这时进程会等待一个signal,这一段时间CPU不会被使用,clcok()认为时间没有流逝所致。而windows平台却是认为Sleep时也是有时间流逝的,而不是看CPU有没有被使用,我也是这么考虑的 :-)。这样一来两者之间就有了极大的不同。
所以,想要一个正确的跨平台的timer就得自己动些手了。
一种方案是修改sleep,但问题是要保证调用者准确的调用了这个函数,另外,这个方法使用了轮询,感觉不好。一般sleep的调用者都会希望这时候程序不占用CPU资源。
void sleep( clock_t wait )
{
clock_t goal;
wait = (clock_t) wait * CLOCKS_PER_SEC;
goal = wait + clock();
while( goal > clock());
}
另一种方案是自己取当前时间,取代clock(),至于用什么函数则看自己的要求了。发现在这个问题是在一个ACE程序中,我就用ACE封装的函数包装了一个,不同平台的sleep也可用ACE_OS::sleep代替
{
public:
Elapsed()
{
restart();
}
void restart()
{
_tv = ACE_OS::gettimeofday();
}
// 返回以秒为单位的流逝时间
long elapsed()
{
ACE_Time_Value now = ACE_OS::gettimeofday();
return now.sec() - _tv.sec();
}
ACE_Time_Value ACE_elapsed()
{
return (ACE_OS::gettimeofday() - _tv);
}
private:
ACE_Time_Value _tv;
};
如果没有用ACE,完成一个这样的封装也是很简单的,因为,这个功能实在简单:-)
转载于:https://www.cnblogs.com/lzjsky/archive/2011/01/13/1934808.html
浅尝boost之timer相关推荐
- 浅尝boost之format
From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东,但实际使用时基本 ...
- 浅尝key-value数据库(三)——MongoDB的分布式
浅尝key-value数据库(三)--MongoDB的分布式 测试了单机MongoDB的随机读和写入性能,这一节来讲一讲MongoDB的分布式. MongoDB的分布式分成两种,一种是Replicat ...
- Boost:timer计时器测试程序
Boost:timer计时器测试程序 实现功能 C++实现代码 实现功能 boost::asio模块,timer计时器测试程序 C++实现代码 #include <iostream> #i ...
- 论文浅尝 | 利用多语言 wordnet 上随机游走实现双语 embeddings
论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识图谱问答. 来源:Knowledge Based System 链接:https://www.sciencedirect.com/science/a ...
- 论文浅尝 | 图神经网络综述:方法及应用
论文链接:https://arxiv.org/pdf/1812.08434.pdf GNN相关论文列表链接:https://github.com/thunlp/GNNPapers 近日,清华刘知远老师 ...
- 论文浅尝 | 当知识图谱遇上零样本学习——零样本学习综述
随着监督学习在机器学习领域取得的巨大发展,如何减少人工在样本方面的处理工作,以及如何使模型快速适应层出不穷的新样本,成为亟待解决的问题.零样本学习(Zero-Shot Learning, ZSL)的提 ...
- 论文浅尝 | 近期论文精选
本文转载自公众号 PaperWeekly, 对我们近期的论文浅尝进行了精选整理并附上了相应的源码链接,感谢 PaperWeekly! TheWebConf 2018 ■ 链接 | https://ww ...
- 论文浅尝 | 从 6 篇顶会论文看「知识图谱」领域最新研究进展 | 解读 代码
本文内容源自往期「论文浅尝」,由 PaperWeekly 精选并重新排版整理,感谢 PaperWeekly. ISWC 2018 ■ 链接 | http://www.paperweekly.site/ ...
- 通过集成腾讯 IM 来浅尝一下.net 6 的 MINI API
背景 下一篇在继续 Go 的学习笔记,因为这阵子一直有项目压着,确实没有精力去总结学习成果.所以这篇就先换换口味,切回老本行,分享一下.net 6 的一个小知识. 前些天,我们对外提供的一些管理系统, ...
最新文章
- NSAutoreleasePool
- 代码和普通的java_Java中普通代码块,构造代码块,静态代码块区别及代码示例...
- TensorFlow学习笔记-实现经典LeNet5模型(转载)
- 关于用例需要多少文档以及业务用例等等
- java 异步事件_Java编程入门——异步事件:轮询与中断
- Docker_容器数据卷
- 数据结构之---二叉树C实现
- Nginx教程-日志配置
- Ansible-----循环
- 使用Task简化Silverlight调用Wcf
- 安卓工控主板运行时会自动重启_工控机日常维护的方法与步骤
- bat启动脚本 springboot_Windows系统配置.bat启动spring boot项目jar
- 使用若依写微信小程序登录授权认证接口
- vsftp限制ip地址访问
- ubuntu opencv多版本控制
- SQLEXPRESS的连接字符串
- java 数字转换字母大写_大写字母或小写字母转换为数字
- IOS 蓝牙相关-BabyBluetooth蓝牙库介绍(4)
- git获取所有branch_获取Git仓库的所有分支名字
- 酷派童年童装×××随
热门文章
- 用python画常密度轮廓线,如何使用Matplotlib在极坐标中绘制具有等高线密度线的散点图?...
- 计算机数控系统的软件结构模式,第四章 计算机数控系统(CNC系统)
- mysql 存储过程 条件_mysql sql存储过程条件定义与处理
- python模拟键盘输入视频_python教程-模拟鼠标和键盘输入
- 商业逻辑12讲之管理沟通的逻辑
- 电路常识性概念(6)-VCC、VDD和VSS三种标号的区别
- 眉骨高者为大贵之相_什么样才算富贵相?曾国藩的识人秘诀(组图)
- mysql connect返回值_mysql_connect
- 10a大电流稳压芯片_一文教你秒懂LDO芯片电路设计的六大因素
- java class 生成对象_面向对象编程,你知道Java有哪些创建对象的方式吗?