Boost库学习2 - 计时器Timer库

  • timer是小型的计时器,不适用于高精度的时间测量任务,它的精度依赖操作系统或编译器,难以做到跨平台;
  • timer也不适用于测量大跨度时间段,如果需要天、月等的时间跨度,则应使用date_time库;
  • timer提供时间度量和进度显示功能,包含三个组件:计时器类timer、timer类的子类progress_timer类、进度指示类progress_display;

Timer

  • timer的计时器使用了标准头文件里的std::clock()函数,它返回自进程启动以来的clock数,每秒的clock数则由宏
    CLOCKS_PER_SEC定义,在不同的操作系统中其值不同,在win32下,其值是1000,精度为毫秒,而在linux下为1000000,精度为微秒;
  • timer位于boost命名空间中,使用之前需要包含头文件<boost/timer.hpp>;
  • -可以测量时间的流速,提供毫秒级别的计时精度和操作函数;
  • timer对象一旦被声明,它的构造函数就开启了计时工作
  • 函数
// 返回可度量的最大时间间隔
 elapsed_max()
 
//返回可度量的最小时间间隔
 elapsed_min()
 
//返回timer类创建到elapsed()函数调用时所流逝的时间
 elapsed()

// 重新计时
restart()
  • 示例
#include <iostream>
#include "boost/timer.hpp"

int main()
{
	boost::timer t;

	std::cout << "每秒时钟数:" << CLOCKS_PER_SEC << std::endl;
	std::cout << "可度量的最大时间:" << t.elapsed_max() / 3600 << "小时" << std::endl;
	std::cout << "可度量的最小时间:" << t.elapsed_min() << "秒" << std::endl;
	std::cout << "到现在已流逝的时间:" << t.elapsed() << "秒" << std::endl;

	t.restart();//重新计时
	for (auto i = 0; i < 1000000000; ++i)
	{
		auto t = i;
	}
	std::cout << "一亿次循环消耗时间:" << t.elapsed() << "秒" << std::endl;

	getchar();
	return 0;
}

在这里插入图片描述

progress_timer

  • 继承自timer的一个自动计时器;
  • process_timer位于名字空间boost,使用之前需要包含头文件<boost/progress.hpp>;
  • 在构造时,可指定析构时的输出定向到指定的I/O流,默认是std::cout;
  • 在析构时会自动调用此类的elapsed()从而自动输出时间;
#include<string>
#include<iostream>
#include<sstream>
#include <windows.h>
#include "boost/progress.hpp"

int main()
{
	{
		std::stringstream ss;
		{
			boost::progress_timer t(ss);
			Sleep(10);
		}
		std::cout << "指定输出耗时:" << ss.str() << std::endl;
	}

	{
		boost::progress_timer t;
		Sleep(20);
	}
	
	getchar();
	return 0;
}

在这里插入图片描述

progress_display

  • 可以在控制台显示程序的执行进度,更具动态感;如果程序执行比较耗时,那么它能够提供一个友好的用户界面,不至于让用户在等待中失去耐心;
  • progress_display位于名字空间boost,使用之前需要包含头文件<boost/progress.hpp>;
#include<iostream>
#include <vector>
#include "boost/progress.hpp"

int main()
{
	std::vector<int> vec(10);

	boost::progress_display pd(vec.size());

	for (int i = 0; i < 10; i++)
	{
		vec.push_back(i);
	}
	
	getchar();
	return 0;
}

在这里插入图片描述

cpu_timer

  • cpu_timer是timer的高精度版本,建议使用cpu_timer;
  • cpu_timer使用了chrono库的高精度时钟high_resolution_clock,能够度量进程使用的实际时间和CPU时间,支持最高到微秒精度的计时;
  • cpu_timer位于名字空间boost::timer,使用之前需要包含头文件<boost/timer/timer.hpp>;

时间类型

 //计时用的ns类型
typedef boost::int_least64_t nanosecond_type;

//cpu时间类型
struct cpu_times
{
	//挂钟(日历时间),进程运行的实际时间
	nanosecond_type wall;

	//用户CPU(进程)时间,进程执行用户指令使用的CPU时间
	nanosecond_type user;	

	//系统CPU(进程)时间,进程执行系统内核调用使用的CPU时间
	nanosecond_type system;								

	//清零
	void clear() { wall = user = system = 0LL; }       
}; 

格式化打印:
%w : 挂钟时间,即cpu_times.wall值
%u:用户CPU时间,即cpu_times.user值
%s:系统CPU时间,即cpu_times.system值
%t:总计CPU时间,即cpu_times.user + cpu_timers.system
%p:总计CPU时间占挂钟时间的百分比

函数

// 开始一个计时器
void cpu_timer::start() noexcept;             

// 结束一个计时器
void cpu_timer::stop()  noexcept;             

// 如果已经调用了stop,resume可以继续进行计时(如果想重新启动计时器则需要调用start() )
void cpu_timer::resume() noexcept;           

// 计时器是否已经停止计时(call stop())
bool cpu_timer::is_stopped() noexcept; 

// 如果is_stopped(),那么返回从计时开始至stop()之间的时间间隔;否则返回从计时开始至调用此函数的时间间隔
cpu_times cpu_timer::elapsed() noexcept; 

//返回 elapsed的字符串形式 
//places代表精度,places = 3, 表示精确到小数点后3位,单位为秒
//format代表格式化字符串 ,常用的是%w,表示cpu_times.wall
std::string format(int places, const string &format)const; 
std::string format(int places = default_places) const; 

auto_cpu_timer

  • 类似progress_timer的自动计时器,继承自cpu_timer;

示例


#include <iostream>
#include <windows.h>
#include <boost/timer/timer.hpp>
#include <boost/algorithm/string.hpp>

int main()
{
	//构造函数,启动计时器
	boost::timer::cpu_timer t;                          
	
	// 做一些事
	for (auto i = 0; i < 1000000; i++)
		auto t = i;

	t.stop();                               //停止计时器
	assert(t.is_stopped());

	// 做一些事
	for (auto i = 0; i < 10000000; i++)
		auto t = i;

	t.resume();                    //恢复计时器运行
	assert(!t.is_stopped());

	// 做一些事
	for (auto i = 0; i < 100000000; i++)
		auto t = i;

	const std::string fmt("[cpu_timer]\n进程时间= %w 秒,\n用户CPU时间 %u 秒 + 系统CPU时间 %s 秒 = 总计CPU时间 %t 秒, \n总计CPU时间占挂钟时间的百分比=百分比是%p");
	std::cout << t.format(6, fmt);  //格式化输出

	{
		const std::string fmt("\n\n[auto_cpu_timer]\n进程时间= %w 秒,\n用户CPU时间 %u 秒 + 系统CPU时间 %s 秒 = 总计CPU时间 %t 秒, \n总计CPU时间占挂钟时间的百分比=百分比是%p");
		boost::timer::auto_cpu_timer ct(6, fmt);
		// 做一些事
		for (auto i = 0; i < 10000000; i++)
			auto t = i;
	}

	getchar();
	return 0;
}

在这里插入图片描述


知识总结,交流学习,不当之处敬请指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值