Boost::timer库详解

Boost是一个功能强大、构造精巧、跨平台、并且完全免费的C++程序库,有着C++“准标准库”的美誉。

目录

1 timer概述

1.1 timer组件的介绍

1.2 progress_timer介绍

1.3 progress_display介绍


在vs上构建Boost库可以参考我的博文:

vs2019安装boost库

从这篇文章开始,我将陆续总结Boost库的相关内容,欢迎大家阅读、指正。

我们知道,在C++中缺乏对时间和日期的处理能力,但是时间和日期确是一个经常用到的内容。

Boost库使用timer和data_time库对时间和日期进行了完美的构建,使时间和日期在c++中也能简易的使用。

1 timer概述

timer使Boost中一个很小的库,提供简易的度量时间和进度显示功能,可以用于计时任务。

timer库包含三个组件:计时器类的timer、progress_timer和进度指示类的progress_display。

接下来分别进行介绍。

1.1 timer组件的介绍

timer相当于一个计时器(毫秒级),同时提供相关的操作函数供程序员使用。

对于timer类的用法如下所示:

//引入头文件,.hpp为.h+cpp,这样的文件不需要预先编译
#include<boost/timer.hpp>
#include<iostream>
using namespace std;
//使用boost命名空间
using namespace boost;
int main()
{
	timer t;//定义一个计时器,从定义出开始计时
	//计时器最大计时时间
	cout << "max timespan:" << t.elapsed_max() / 3600 << "h" << endl;
	//计时器最小计时时间
	cout << "min timespan:" << t.elapsed_min() << "s" << endl;
	//输出计时器当前的计时时间
	cout << "now time elapsed" << t.elapsed() << "s" << endl;
}

程序打印结果如下:

timer还有一个常用的方法如下:

void restart(){_start_time = std::clock();}
//重新计时

timer的实现比较简单,主要是通过std::clock()实现的。

我们可以发现,Boost提供给程序员的接口都是简单明了的,非常的人性化。

1.2 progress_timer介绍

首先progress_timer也是一个计时器,继承了timer的全部功能(函数)。使用它的好处是程序员不再像使用timer那样手动的去调用elapsed()函数去获取计时时间,progress_timer在析构的时候会自动调用elspsed()函数。

如下程序示例:

//引入头文件
#include<boost/progress.hpp>
#include<iostream>
using namespace std;
//使用boost命名空间
using namespace boost;
int main()
{
	{
		progress_timer  t;//定义一个计时器,从定义出开始计时
		int sum = 0;
		for (int i = 0; i < 100000000; ++i) 
		{
			++sum;
		}
	}
	cout<<"计时完成"<<endl;
	return 0;
	
}

程序打印结果:

可以发现,progress_timer在出作用时析构,并且调用elapsed函数。作用域内代码运行时长0.18s,看来我的电脑运行速度还挺快的。

改变输出流:

同时progress_timer还可以配合stringstream来使用,可以将信息输出在stringstream中。如下所示:

stringstream s;
{
    progress_timer t(s);//出作用域后会将信息输入在s中,而不是打印出来
}
cout << s.str()<< endl;//可以通过s将t的计时信息进行打印

1.3 progress_display介绍

实不相瞒,这是三个组件里面我最喜欢的一个,以为能在c++终端的黑框框里面看到点图画之类的东西太难了。

具体是怎么回事呢?

我们用实例来分析这个组件:

//引入头文件
#include<boost/progress.hpp>
#include<Windows.h>
//使用boost命名空间
using namespace boost;
int main()
{

	progress_display pd(100);

	for (int i = 0; i < 100; ++i)
	{
		Sleep(100);
		++pd;
	}
	return 0;
}

上述代码的打印效果如下:

是不是感觉眼前一亮。接下来我们来介绍progress_display组件。

progress_display和timer库中的另外两个组件没有关系,如果程序执行很耗时间,那么这个组件能够提供如上图所示的一种友好的界面。类似于一个进度条。

progress_display的成员方法如下图所示:

构造函数可以接受一个unsigned long型的参数,作为基数,即每次(每次计数)打印100/expected_count个“*”。可以根据++和+=来增加计数。

同时构造函数还接受一个长整型,一个流(可以将信息输入到固定流),三个字符串(分别作为三行的开始标识符):

例如我们将上述代码中的progress_display pd(100);换成如下代码:

progress_display pd(100,cout,"%%%","+++","???");
//cout表示输出到屏幕,也可以换成文件流,输出到文件

打印效果如下:

需要注意,在进度条的的打印无法与程序的输出隔离:

我们在上述代码中的++pd之前添加一个打印信息cout<<"hello"<<endl;

那么输出将变成如下所示的情况:

这个问题我们在使用progress_display的过程中需要着重注意一下。

至此,Boost::timer就介绍完了。

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值