一個簡單的時鐘頻率計數器
示例子代碼如下
#include <Windows.h>
//////////////////////////////////////////////////////////////////////////
// 一個簡單的時鐘頻率計數器: 用CPU時鐘進行精確計時
//////////////////////////////////////////////////////////////////////////
class CQueryCPUFrequency
{
public:
CQueryCPUFrequency()
{
Reset();
}
public:
void Reset()
{
ZeroMemory((void*)(&m_lvFrequency),sizeof(LARGE_INTEGER));
ZeroMemory((void*)(&m_lvBegin),sizeof(LARGE_INTEGER));
ZeroMemory((void*)(&m_lvEnd),sizeof(LARGE_INTEGER));
}
LONGLONG QueryFrequency()
{
if(m_lvFrequency.QuadPart<=0)
{
// 獲取每秒多少CPU Performance Tick
if(!::QueryPerformanceFrequency(&m_lvFrequency))
{
return LONGLONG(0);
}
}
return m_lvFrequency.QuadPart;
}
BOOL QueryBegin(){return QueryPerformance(m_lvBegin);}
BOOL QueryEnd(){return QueryPerformance(m_lvEnd);}
void QueryContinue(BOOL bZero = FALSE)
{
m_lvBegin = m_lvEnd;
if(bZero)ZeroMemory((void*)(&m_lvEnd),sizeof(LARGE_INTEGER));
}
LONGLONG FrequencyCountor()
{
return m_lvEnd.QuadPart - m_lvBegin.QuadPart;
}
double FrequencySeconds()
{
LONGLONG nFrequency = QueryFrequency();
LONGLONG nCountor = FrequencyCountor();
if(nFrequency<=0) return (double)(0.0);
double d = (double)nCountor / (double)nFrequency;
return d;
}
protected:
BOOL QueryPerformance(LARGE_INTEGER& lv)
{
// 獲取CPU運行到現在的Tick數
return ::QueryPerformanceCounter(&lv);
}
private:
LARGE_INTEGER m_lvFrequency;
LARGE_INTEGER m_lvBegin;
LARGE_INTEGER m_lvEnd;
};