我一直是在努力推介boost,因为boost是一块美玉,但,没有什么是完美的。现在,我将暴露出boost的一点瑕疵:boost::timer。虽说是瑕不掩瑜,但瑕疵就是瑕疵。先看一看下面的例子:

 // win2000 中vc7.1编译运行
 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之样的库之中。基本只是下面的东西

 class timer
 {
  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代替

 class Elapsed
 {
 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相关推荐

  1. 浅尝boost之format

    From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东,但实际使用时基本 ...

  2. 浅尝key-value数据库(三)——MongoDB的分布式

    浅尝key-value数据库(三)--MongoDB的分布式 测试了单机MongoDB的随机读和写入性能,这一节来讲一讲MongoDB的分布式. MongoDB的分布式分成两种,一种是Replicat ...

  3. Boost:timer计时器测试程序

    Boost:timer计时器测试程序 实现功能 C++实现代码 实现功能 boost::asio模块,timer计时器测试程序 C++实现代码 #include <iostream> #i ...

  4. 论文浅尝 | 利用多语言 wordnet 上随机游走实现双语 embeddings

    论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识图谱问答. 来源:Knowledge Based System 链接:https://www.sciencedirect.com/science/a ...

  5. 论文浅尝 | 图神经网络综述:方法及应用

    论文链接:https://arxiv.org/pdf/1812.08434.pdf GNN相关论文列表链接:https://github.com/thunlp/GNNPapers 近日,清华刘知远老师 ...

  6. 论文浅尝 | 当知识图谱遇上零样本学习——零样本学习综述

    随着监督学习在机器学习领域取得的巨大发展,如何减少人工在样本方面的处理工作,以及如何使模型快速适应层出不穷的新样本,成为亟待解决的问题.零样本学习(Zero-Shot Learning, ZSL)的提 ...

  7. 论文浅尝 | 近期论文精选

    本文转载自公众号 PaperWeekly, 对我们近期的论文浅尝进行了精选整理并附上了相应的源码链接,感谢 PaperWeekly! TheWebConf 2018 ■ 链接 | https://ww ...

  8. 论文浅尝 | 从 6 篇顶会论文看「知识图谱」领域最新研究进展 | 解读 代码

    本文内容源自往期「论文浅尝」,由 PaperWeekly 精选并重新排版整理,感谢 PaperWeekly. ISWC 2018 ■ 链接 | http://www.paperweekly.site/ ...

  9. 通过集成腾讯 IM 来浅尝一下.net 6 的 MINI API

    背景 下一篇在继续 Go 的学习笔记,因为这阵子一直有项目压着,确实没有精力去总结学习成果.所以这篇就先换换口味,切回老本行,分享一下.net 6 的一个小知识. 前些天,我们对外提供的一些管理系统, ...

最新文章

  1. NSAutoreleasePool
  2. 代码和普通的java_Java中普通代码块,构造代码块,静态代码块区别及代码示例...
  3. TensorFlow学习笔记-实现经典LeNet5模型(转载)
  4. 关于用例需要多少文档以及业务用例等等
  5. java 异步事件_Java编程入门——异步事件:轮询与中断
  6. Docker_容器数据卷
  7. 数据结构之---二叉树C实现
  8. Nginx教程-日志配置
  9. Ansible-----循环
  10. 使用Task简化Silverlight调用Wcf
  11. 安卓工控主板运行时会自动重启_工控机日常维护的方法与步骤
  12. bat启动脚本 springboot_Windows系统配置.bat启动spring boot项目jar
  13. 使用若依写微信小程序登录授权认证接口
  14. vsftp限制ip地址访问
  15. ubuntu opencv多版本控制
  16. SQLEXPRESS的连接字符串
  17. java 数字转换字母大写_大写字母或小写字母转换为数字
  18. IOS 蓝牙相关-BabyBluetooth蓝牙库介绍(4)
  19. git获取所有branch_获取Git仓库的所有分支名字
  20. 酷派童年童装×××随

热门文章

  1. 用python画常密度轮廓线,如何使用Matplotlib在极坐标中绘制具有等高线密度线的散点图?...
  2. 计算机数控系统的软件结构模式,第四章 计算机数控系统(CNC系统)
  3. mysql 存储过程 条件_mysql sql存储过程条件定义与处理
  4. python模拟键盘输入视频_python教程-模拟鼠标和键盘输入
  5. 商业逻辑12讲之管理沟通的逻辑
  6. 电路常识性概念(6)-VCC、VDD和VSS三种标号的区别
  7. 眉骨高者为大贵之相_什么样才算富贵相?曾国藩的识人秘诀(组图)
  8. mysql connect返回值_mysql_connect
  9. 10a大电流稳压芯片_一文教你秒懂LDO芯片电路设计的六大因素
  10. java class 生成对象_面向对象编程,你知道Java有哪些创建对象的方式吗?