C++ 高精度計時

#ifndef STOPWATCH_H
#define STOPWATCH_H

#include <Windows.h>

// ************************ 文件說明 **************************
	//
	// 該類通過使用 Windows API 獲取 CPU 的時鐘頻率,來實現高精度計時,
	// 可計時精度爲微秒,因個人習慣,在 C# 中,使用 Stopwatch 進行計時,
	// 所以,此處亦將該類命名爲 Stopwatch
	//
	// ************************************************************

	struct Elapsed;

	class Stopwatch
	{
	public: 
		Stopwatch();
		~Stopwatch();

	public: 
		void start();
		void stop();
		void restart();
		Elapsed elapsed() const;

	private:
		LARGE_INTEGER m_freq;	// 該變量用於存儲 cpu 時鐘頻率
		LARGE_INTEGER m_start;	// 該變量用於存儲計時開始時的時鐘頻率
		LARGE_INTEGER m_end;	// 該變量用於存儲計時結束時的時鐘頻率
		Elapsed *m_elapsed;

	};

	struct Elapsed
	{
		double getMicroSeconds() const;		// 獲取微秒
		double getMilliSeconds() const;		// 獲取毫秒
		double getSeconds() const;			// 獲取秒


		double m_microSeconds = 0;	// 微秒
		double m_milliSecodes = 0;	// 毫秒
		double m_seconds = 0;		// 秒

	};
#include "Stopwatch.h"
Stopwatch::Stopwatch()
	{
		m_elapsed = new Elapsed();
		QueryPerformanceFrequency(&m_freq);
	}

	Stopwatch::~Stopwatch()
	{
		// 釋放內存
		if (m_elapsed != nullptr)
		{
			delete m_elapsed;
			m_elapsed = nullptr;
		}

	}

	void Stopwatch::start()
	{
		QueryPerformanceCounter(&m_start);
	}

	void Stopwatch::stop()
	{
		QueryPerformanceCounter(&m_end);
		m_elapsed->m_microSeconds += 1000000.0 * (static_cast<double>(m_end.QuadPart) 
			- static_cast<double>(m_start.QuadPart)) / static_cast<double>(m_freq.QuadPart);
	}

	void Stopwatch::restart()
	{
		m_elapsed->m_microSeconds = 0;
		start();
	}

	Elapsed Stopwatch::elapsed() const
	{
		return *m_elapsed;
	}

	double Elapsed::getMicroSeconds() const
	{
		return m_microSeconds;
	}

	double Elapsed::getMilliSeconds() const
	{
		return m_microSeconds / 1000.0;
	}

	double Elapsed::getSeconds() const
	{
		return m_microSeconds / 1000000.0;
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章