1.传统定时器
适用于在一个函数内需要分段计时的情况;
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
int main()
{
auto start = chrono::steady_clock::now();
//模拟程序运行用时
this_thread::sleep_for(chrono::milliseconds(2000));
auto end = chrono::steady_clock::now();
auto duration = chrono::duration_cast<chrono::milliseconds>(end - start);
cout << duration.count() << "ms" << endl;
return 0;
}
2.传统计时器的宏改
这种方法适用于程序连续计时:其中TIME_START只能出现一次
#define TIME_START \
std::chrono::time_point<std::chrono::system_clock> start, finish; \
chrono::duration<double, milli> elapsed_time; \
start = chrono::system_clock::now();
#define TIME_END \
finish = chrono::system_clock::now(); \
elapsed_time = finish - start; \
start = chrono::system_clock::now(); \
cout << "Time used: " << elapsed_time.count() << "ms" << endl;
3.装饰器模式的计时器
使用lambda函数进行包装计时
#include <iostream>
#include <chrono>
#include <ctime>
#include <functional>
using namespace std;
class Timer
{
public:
Timer(function<void()> func)
:func_(func)
{
}
void operator()()
{
auto start = chrono::system_clock::now();
func_();
auto end = chrono::system_clock::now();
chrono::duration<double, milli> elapsed_time = end - start;
cout << "elapsed time: " << elapsed_time.count() << " ms" << endl;
}
private:
function<void()> func_;
};
//在调用处:
int main()
{
// 包装被计时函数
Timer t([&](){
cout << "do something..." << endl;
});
// 调用被计时函数
t();
return 0;
}