timer类非常小,全部实现加上注释才72行。非常有必要深入了解一下。下面的源码基本与timer.hpp一致,不过自己多此一举地加了一个析构函数。事实上没有资源需要销毁,只是为了承接progress_timer组件的学习。
使用建议:
timer类接口简单,轻巧好用,适合于大部分的程序计时任务。不过就精度而言,它不适用于高精度时间测量任务。难以做到跨平台。也不适合大跨度时间段的测量,可提供的最大时间跨度只有几百个小时。
#include <iostream>
#include <ctime>
/*
cmath库里的std::clock(),返回自进程启动以来的clock数,每秒的clock数由宏CLOCKS_PER_SEC定义
CLOCKS_PER_SEC的值因操作系统而不同.win32下是1000,而linux下是1000,000.也就是说在
win32下的精度是毫秒,而linux下是微秒
*/
using namespace std;
class timer{
public:
timer(){_start_time = std::clock();}
void restart(){_start_time = std::clock();}
double elapsed() const{return double(std::clock() - _start_time) / CLOCKS_PER_SEC;}
double elapsed_max() const{
return (double((std::numeric_limits<std::clock_t>::max)()) - double(_start_time)) / double(CLOCKS_PER_SEC);
} //标准库的数值极限类numeric_limits,获得clock_t类型的最大值
double elapsed_min() const{return double(1) / double(CLOCKS_PER_SEC);}
~timer(){cout << "runtime:" << elapsed() << " s" << endl;}
private:
std::clock_t _start_time; //没必要释放该资源
};
int main(){
timer t;
int sum = 0;
unsigned int i;
for(i = 0; i < 960000000; ++i){//计算9亿条指令花费的时间(因电脑性能而异)
sum++;
}
cout << "accuracy:" << t.elapsed_min() << " s" << endl //精度为毫秒
<< "elapsed max:" << t.elapsed_max() / 3600 << " hours." << endl;//最大时间跨度为几百个小时
//timer对象析构时输出程序已运行的时间
}
运行结果如下:
accuracy:0.001 s
elapsed max:596.523 hours.
runtime:0.484 s
直接用boost库,代码如下:
#include <iostream>
#include <boost/timer.hpp>
using namespace boost;
using namespace std;
int main(){
timer t;
cout << "max elapsed:" << t.elapsed_max() / 3600 << " hours" << endl
<< "min elapsed:" << t.elapsed_min() << " s" << endl
<< "now elapsed:" << t.elapsed() << endl;
}
运行结果:
max elapsed:596.523 hours
min elapsed:0.001 s
now elapsed:0