1. timer类实现

#pragma once

#include <ctime>
#include <limits> class timer
{
public:
timer(){ _start_time = clock(); }
void restart(){ _start_time = clock(); }
double elapsed() const
{
return (double)(clock() - _start_time) / CLOCKS_PER_SEC;
}
double elapsed_min() const
{
return (double)() / (double)CLOCKS_PER_SEC;
}
double elapsed_max() const
{
return (double)(std::numeric_limits<clock_t>::max() - _start_time) / double(CLOCKS_PER_SEC); }
private:
clock_t _start_time;
};

2. 重点说明

2.1 CLOCKS_PER_SEC

  timer的计数使用了标准头文件<ctime>里的clock()函数,它返回自进程启动以来的clock计数,每秒的clock数由宏CLOCKS_PER_SEC定义,CLOCKS_PER_SEC的值因操作系统而不同,在win32下是1000,而在linux下则是1000000,页就是说在win32下的精度是毫秒,在linux下的精度是微妙。

2.2 numeric_limits模版

  说白了,它是一个模板类,它主要是把C++当中的一些内建型别进行了封装,比如说numeric_limits<int>是一个特化后的类,从这个类的成员变量与成员函数中,我们可以了解到int的很多特性:可以表示的最大值,最小值,是否是精确的,是否是有符号等等。如果用其他任意(非内建类型)来特化这个模板类,比如string,string怎么可能有最大值?我们从MSDN上可以了解到,这对string,成员变量与成员函数是没有意义的,要么返回0要么为false。

  参考博客:http://blog.163.com/wujiaxing009%40126/blog/static/7198839920124135147911/

2.3 使用建议

  timer不适合高精度的时间测量任务,它的精度依赖操作系统或编译器,难以做到跨平台,timer也不适合大跨度时间段的测量,可提供的最大时间跨度只有几百个小时,如果需要以天、月甚至年作为时间的单位则不能使用timer,应使用date_time.

3. 扩展new_progress_timer

3.1 代码实现

template<int N = >
class new_progress_timer : public timer
{
public:
new_progress_timer(ostream &os = cout)
:m_os(os)
{ } ~new_progress_timer()
{
try
{
// 保存流的状态
ostream::fmtflags old_flags = m_os.setf(ostream::fixed, ostream::floatfield);
streamsize old_prec = m_os.precision(N); // 输出时间
m_os << elapsed() << "s\n" << endl; // 恢复流状态
m_os.flags(old_flags);
m_os.precision(old_prec);
}
catch (...){}
}
private:
ostream &m_os; // 需要特别注意
};

继承于timer类,主要实现输出时间的精度控制

注意代码的最后一行,原因是:

protected:
__CLR_OR_THIS_CALL basic_ostream(_Myt&& _Right)
{ // construct by moving _Right
_Myios::init();
_Myios::move(_STD move(_Right));
} _Myt& __CLR_OR_THIS_CALL operator=(_Myt&& _Right)
{ // move from _Right
this->swap(_Right);
return (*this);
} void __CLR_OR_THIS_CALL swap(_Myt& _Right)
{ // swap with _Right
if (this != &_Right)
_Myios::swap(_Right);
} public:
__CLR_OR_THIS_CALL basic_ostream(const _Myt&) = delete;
_Myt& __CLR_OR_THIS_CALL operator=(const _Myt&) = delete;

  

boost之timer的更多相关文章

  1. Boost中timer的简易用法

    boost::asio::deadline_timer timer_; timer_(io_service), timer_.expires_from_now(boost::posix_time::s ...

  2. 初探boost之timer库学习笔记

    timer   使用方法     #include <boost/timer.hpp> #include <iostream> using namespace std; usi ...

  3. Boost中的Timer的使用——计算时间流逝

    使用Boost中的Timer库计算程序的运行时间 程序开发人员都会面临一个共同的问题,即写出高质量的代码完毕特定的功能.评价代码质量的一个重要标准就是算法的运行效率,也就是算法的运行时间.为了可靠的提 ...

  4. CLion之C++框架篇-优化框架,引入boost(三)

      背景   结合上一篇CLion之C++框架篇-优化框架,单元测试(二),继续进行框架优化!这一版优化引入一个我们日常经常使用的操作库Boost,估算使用频率在70%以上!   Boost的优势在哪 ...

  5. boost::asio::deadline_timer(理解)

    并发与并行: 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生. 1.Timer.1 - 使 ...

  6. boost.asio系列(一)——deadline_timer

    一.构造函数 一个deadline_timer只维护一个超时时间,一个deadline_timer不同时维护多个定时器.在构造deadline_timer时指定时间: basic_deadline_t ...

  7. 利用deadline_timer实现定时器Timer

    // 类似QTimer的定时器 class Timer { typedef void(* handler)(); public: Timer() : m_millseconds() , m_timer ...

  8. cpprestsdk同时使用boost.asio,acceptor就一直报Invalid argument。

    本文目录,首先总结问题,然后案例还原. 总结: 问题的根本在于boost.asio作为header-only库,运行程序与动态库之间容易因为版本错配而产生运行期莫名其妙的问题. cpprestsdk使 ...

  9. Linux多线程服务端编程:使用muduo C++网络库

    内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这 ...

随机推荐

  1. git多人协作--分支

    分支: 创建分支: git checkout -b 新分支 切换分支: git checkout 目标分支 删除分支: git branch -d 待删除分支 推送到远程分支: git checkou ...

  2. PAT (Advanced Level) 1086. Tree Traversals Again (25)

    入栈顺序为先序遍历,出栈顺序为中序遍历. #include<cstdio> #include<cstring> #include<cmath> #include&l ...

  3. ThreadGroup

    http://blog.csdn.net/a352193394/article/details/39323427

  4. 大整数类BIGN的设计与实现 C++高精度模板

    首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...

  5. 使用fastJson把对象转字符串首字母大小写问题的解决

    例如:文档中要求传输的字段为 但是转成json字符串后却变成了: 解决方式: 在实体类的get方法上添加@JSONField(name = " ") 注解后问题解决: 输出:

  6. 【c专家编程】分析c语言的声明

    联合: 在结构中,每个成员依次存储,而在联合中,所有成员都从偏移地址零开始存储,联合一般被用来节省空间,用法和struct相同. union bits32_tag { int whole; // 一个 ...

  7. SQL存储过程实例详解

    本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1         学校图书馆借书信息管理系统建立三个表:         学生信息表:student 字段名称 数据类型 说明 ...

  8. UVa 10295 - Hay Points

    题目:有非常多工人.相应一个能力描写叙述表,每种能力有一个权值,求每一个工人的能力值. 分析:字符串.hash表,字典树.利用散列表或者字典树存储相应的单词和权值.查询就可以. 说明:注意初始化,计算 ...

  9. photoshop 前端常用技巧

    1.将图片转换成 png 格式 并且 使背景透明 (1)用矩形选框工具选取一块区域 (2)右键 选择 ‘变换选区’ 进行微调 F8 查看尺寸 (3)复制图层(ctrl+c) ->新建文件(ctr ...

  10. Multi-company rules

    Object Name Domain 说明 Point of Sale Point Of Sale Order [('company_id', '=', user.company_id.id)] 指派 ...