- 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;
}
知识总结,交流学习,不当之处敬请指正,谢谢!