源码之timer类

class timer{
public:
  timer(){_start_time = std::clock();}
  void restart(){_start_time = std::clock();}
  double elapsed()const{
     return double(std::clock()-_start_time)/CLOCKS_PER_SEC;
  }
  double elpsed_min()const{
     return double(1)/double(CLOCKS_PER_SEC);
  }
   double elspsed_max()const{
     return (double((std::numberic_limits<std::clock_t>::max)())-double(_start_time))/double(CLOCKS_PER_SEC);
  }
private:
  std::clock_t _start_time;
}

以上是boost中关于time的类源码。该类接口简单,使用轻巧,可使用与大部分计时任务。

源代码中使用c++标准库头文件<ctime>中的std::clock()函数,该函数返回自进程启动以来的clock数,而每一秒的clock数则是由宏定义CLOCKS_PER_SEC决定,该宏定义的值因操作系统而异,Win32下是1000即精度为毫秒,Linux下则为1000000即精度为微妙。

timer的构造函数中记录了当前的clock数作为计时起点,并将起点记录在私有变量_start_time中,每当调用elapsed方法时,获取此时的clock数值,然后减去起点时的clock值就是流失的clock数值差,然后除以宏定义CLOCKS_PER_SEC转换成系统精度的时间。

timer::restart()

方法重新设置计时起点值,即std::clock()获取当前的clock数赋值给_start_time。

timer::elapsed_min()

用于获取该类能够获取的最小时间单位。即CLOCKS_PER_SEC宏定义的倒数。

timer::elapsed_max()

同理获取时间的最大单位。该方法中使用了标准库中的数值极限类numberric_limits来获取系统能容纳最大的clock数,然后减去起点的_start_time来计算可能的最大clock差值,除以宏定义CLOCKS_PER_SEC转换以下时间单位。

你可能会发现该类没有析构函数,这是因为该类中只有一个std::clock_t类型的私有属性,并没有什么资源可以释放,所以不写也是非常明智的抉择。

由此可以看出该类的局限性:如果时间跨度过大,则该类就无法实现时间的测量了。这要依赖于另一个时间类date_time类。明天见<点击这里哦!!!>

时间: 2024-08-04 08:55:14

源码之timer类的相关文章

用Enterprise Architect从源码自动生成类图

http://blog.csdn.net/zhouyong0/article/details/8281192 /*references:感谢资源分享者.info:简单记录如何通过工具从源码生成类图,便于分析代码结构,对源码阅读挺有用.*/ 看点开源代码学习下,本想找个代码查看方便点的工具,便于理清代码层次,结果发现了Enterprise Architect这一好工具,试用下来还挺方便的.功能上和Rational Rose大致是一类,用处很广,很多我都不懂,知道能画各种UML图,支持的源码语言类型

.NET源码之Page类(二) (转)

.NET源码之Page类(二) 我们在.Net源码之Page类(一) 已经介绍过了初始化与加载阶段了.今天将介绍余下的部分.由于是从源代码上了解生命周期,所以这里会有大量的代码.建议大家看本篇博客的时候最好能够一边对照源代码,最好能够自己调试一遍.希望大家在平时碰到过这方面的问题的,可以留言,能够从源代码这个阶段去剖析问题的实质.         首先我们来回顾一下初始化与加载阶段之间的那个阶段,我们先拿MSDN上对初始化和加载阶段的有2句话描述来看一下: 页初始化阶段:如果当前请求是回发请求,

Struts2 源码分析——Result类实例

本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容进行讲解.笔者叫他们为Result类实例.如果还记得在上一章最后笔者说可以把处理action执行的结果简单的理解处理网页.而且还用红色标识.实际是处理跟表现层有关的内容.而不是页面上的内容.如HTML.即是MVC里面的C到V的内容.当然这还关系到配置文件里面的result元素节点信息.如strtus

细读百度地图点聚合源码(下)---Renderer类解析

上一篇文章分析了ClusterMananger的整体结构和核心算法 细读百度地图点聚合源码(上),此文是接着上一篇来的. 在本文中,我们将学习如何在UI线程中做大量的操作,并且不会造成界面卡顿. 上次我们讲到ClusterManager类中的cluster()方法,调用ClusterTask后台线程处理核心算法,既然有doInBackground()后台任务函数,就会有onPostExecute()函数来处理后台线程返回的结果,这一篇我们就分析怎么处理返回的结果. 那么我们就从返回的结果开始吧!

【源码】Timer和TimerTask源码剖析

Timer是java.util包中的一个工具类,提供了定时器的功能.我们可以构造一个Timer对象,然后调用其schedule方法在某个特定的时间或者若干延时之后去执行一个特定的任务,甚至你可以让其以特定频率一直执行某个任务,这个任务用TimerTask描述,我们将需要的操作写在TimerTask类的run方法中即可. 本着"知其然,知其所以然"的心态,我决定研究下这个类的源码. 打开Timer类的源码我发现了这样两个成员变量: /** * The timer task queue.

【ThreadLocal】深入JDK源码之ThreadLocal类

学习JDK中的类,首先看下JDK API对此类的描述,描述如下: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本.ThreadLocal其实就是一个工具类,用来操作线程局部变量,ThreadLocal 实例通常是类中的 private static 字段.它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联. 例如,以下类生成对每个线程

Libevent源码分析-timer和signal处理

timer处理 Signal处理 timerfd和signalfd timerfd signalfd timer处理 在Libevent源码分析-event处理流程中,使用了定时器,来看一下源码: evtimer_set(&ev, time_cb, NULL);//设置定时器事件 其中evtimer_set是个宏定义 #define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg)) //event_set原型 void ev

AppWidget源码分析---接口类

最近项目中接触到AppWidget,相对来说这部分比较简单,所以趁着空余时间详细阅读了AppWidget的源码.这篇文章主要是从源码上分析AppWidget中API类的相关原理,相关类的简单功能介绍和实现原理.关于使用,建议看指导文档. 简述 AppWidget相关的API类(供我们应用开发者使用的类)主要有: AppWidgetProvider:继承这个类,来提供Appwidget. AppWidgetManager:提供了AppWidget的管理接口,比如更新,绑定AppWidget id,

tornado框架源码分析---Application类之debug参数

先贴上Application这个类的源码. class Application(httputil.HTTPServerConnectionDelegate): """A collection of request handlers that make up a web application. Instances of this class are callable and can be passed directly to HTTPServer to serve the a