#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;
}