1. 概述
timer库包含三个组件,分别是timer,progress_timer,progress_display;
2. 头文件
timer类头文件为: #include <boost/timer.hpp>
后两个头文件为: #include <boost/progress.hpp>
3. 使用示例
timer示例:
timer t;
for(int i = 0; i < 100000000; i++){
for(int j = 0; j < 30; j++){
}
}
cout << "elapsed: " << t.elapsed() << "s" << endl;
//elapsed: 3.85019s
cout << "Max " << t.elapsed_max()/3600 << "h Min: " << t.elapsed_min() << "s" << endl;
//Max 2.56205e+09h Min: 1e-06s
progress_timer示例:
{
progress_timer t;
for(int i = 0; i < 100000000; i++){
for(int j = 0; j < 30; j++){
}
}
} //3.81 s
//#include <sstream>
stringstream ss;
{
progress_timer t(ss);
for(int i = 0; i < 100000000; i++){
for(int j = 0; j < 30; j++){
}
}
} //3.81 s
cout << ss.str() << endl;
progress_timer 只能实现两位精度打印,若要实现更高的,可从写并修改代码中的precision参数;
progress_display 示例:
作用: 可在控制台上显示程序的执行进度;
vector<int> v(100000000);
progress_display pd(v.size());
vector<int>::iterator iter;
for(iter = v.begin(); iter!= v.end(); ++iter){
++pd;
}
打印:
0% 10 20 30 40 50 60 70 80 90 100%
|----|----|----|----|----|----|----|----|----|----|
***************************************************
vector<int> v(100000000);
progress_display pd(v.size(),std::cout ,"%%%","+++","???");
vector<int>::iterator iter;
for(iter = v.begin(); iter!= v.end(); ++iter){
++pd;//调用了progress_display 的++重载
}
打印:
%%%0% 10 20 30 40 50 60 70 80 90 100%
+++|----|----|----|----|----|----|----|----|----|----|
???***************************************************
4. 源码分析
//noncopyable:继承后的派生类不可拷贝或赋值;
class progress_timer : public timer, private noncopyable
{
public:
//输出流可自定义
explicit progress_timer( std::ostream & os = std::cout )
: timer(), noncopyable(), m_os(os) {}
//析构是自动计算时间
~progress_timer()
{
try
{
/*
通过设置格式标志来控制输出形式;
std::istream::fixed: 用正常的记数方法显示浮点数;
std::istream::floatfield:小数点后保留6位小数;
*/
std::istream::fmtflags old_flags = m_os.setf( std::istream::fixed,
std::istream::floatfield );
// 设置输出值的有效位数;
std::streamsize old_prec = m_os.precision( 2 );
m_os << elapsed() << " s\n" // "s" is System International d'Unites std
<< std::endl;
//恢复标志
m_os.flags( old_flags );
m_os.precision( old_prec );
}
catch (...) {} // eat any exceptions
} // ~progress_timer
private:
std::ostream & m_os;
};