progress_timer
progress_timer
也是一个计时器,它继承自timer,会在析构时自动输出时间,省去了timer手动调用elapsed()
的工作,是一个用于自动计时相当方便的小工具。
progress_timer
位于名字空间boost
,为了使用progress_timer
组件,需要包含头文件<boost/progress.hpp>
,即:
#include <boost/progress.hpp>
using namespace boost;
用法
progress_timer
继承了timer的全部能力,可以如timer那样使用。
progress_timer t; //声明一个progress_timer对象
... //任意计算 处理工作
cout << t.elapsed() << endl; //输出流逝的时间
但它有更简单的用法,不需要任何的调用,只要声明progress_timer
对象就可以了:
#include<boost/progress.hpp>
int main()
{
boost::progress_timer t; //声明对象开始计时
//do something
} //退出作用域 调用progress_timer的析构函数
这样,在程序退出(准确地说是离开main
函数局部域)导致progress_timer析构时,会自动输出流逝的时间。显示输出:0.23s
如果要在一个程序中测量多个时间,可以运用花括号{}限定progress_timer的生命期
#include <boost/progress.hpp>
int main()
{
{
boost::progress_timer t;
//do something...
}
{
boost::progress_timer t;
//do something...
}
...
}
只需要声明progress_timer的实例就可完成所需的全部工作,非常容易。有了progress_timer,程序员今后在做类似性能测试等计算时间的工作时将会感到轻松很多。
类摘要
progress_timer的类摘要如下:
class progress_timer : public timer, noncopyable
{
public:
explicit progress_timer();
progress_timer(std::ostream& os);
~progress_timer();
};
progress_timer继承自timer,因此它的接口与timer相同,也很简单。唯一需要注意的是构造函数 progress_timer( std::ostream& os )
,它允许将析构时的输出定向到指定的 IO 流里,默认是 std::cout
。如果有特别的需求,可以用其他标准库输出流(ofstream、ostringstream)
替换,或者用cout.rdbuf()
重定向cout
的输出。
例如,下面的代码把progress_timer的输出转移到了stringstream中,它可以被转换为字符串供其他应用使用:
stringstream ss; //一个字符串流对象
{
progress_timer t(ss); //要求progress_timer输出到ss中
} //progress_timer在这里析构,自动输出时间
cout << ss.str();
main.cpp
#include <sstream>
#include <iostream>
using namespace std;
// disable pragma warning
#define BOOST_ALLOW_DEPRECATED_HEADERS
#include <boost/progress.hpp>
using namespace boost;
//
int main()
{
{
boost::progress_timer t;
}
{
boost::progress_timer t;
}
stringstream ss;
{
progress_timer t(ss);
}
cout << ss.str();
}