C++11 简单的Timer

考虑到有的时候需要考察一个函数的耗时,而且精度是可控的,可以是毫秒,微妙,甚至是纳秒。了解了下chrono,可以用chrono很方便的写一个timer。备注:C++20 已经支持 std::cout<

直接上代码

template
class Timer
{
private:
	std::chrono::high_resolution_clock::time_point m_start;
	std::chrono::high_resolution_clock::time_point m_stop;
	std::chrono::duration single_duration;
	std::map< std::string, std::chrono::duration> m_durations;
public:
	Timer() {};
	~Timer() {};
void reset() {
		m_start = std::chrono::high_resolution_clock::now();
	}
 
	void stop()
	{
		single_duration = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - m_start);
	}
 
	void stop(const std::string& tag)
	{
		m_durations[tag] = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - m_start);
	}
auto duration()
	{
		return single_duration;
	}
	auto durations()
	{
		return m_durations;
	}
	void print_duration()
	{
		for (auto i = m_durations.begin(); i != m_durations.end(); ++i)
		{
			std::cout << i->first << " duration = " << i->second << std::endl;;
		}
	}
 
};

这里为了方便,直接把精度作为一个模版参数参数,这里应该可以用默认版本参数实现,这块还没搞清楚,暂时可以应付手上的工作,并且可以多次计时,最后一把搂出来。

使用方法;

1.单次

        Timer timer;	//构建milliseconds 精度
	timer.reset();
	std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	timer.stop();
	auto duration = timer.duration();
	std::cout << "sleep 1000 = " << duration << std::endl;

2. 多次

Timer timer;
timer.reset();
std::this_thread::sleep_for(std::chrono::milliseconds(200));
timer.stop("tcp connect");
std::this_thread::sleep_for(std::chrono::milliseconds(234));
timer.stop("tcp read 100bytes");
std::this_thread::sleep_for(std::chrono::milliseconds(100));
timer.stop("tcp write 1Mb");
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
timer.stop("sock fin");
timer.print_duration();

你可能感兴趣的:(c++,开发语言)