一個簡單的時鐘頻率計數器

一個簡單的時鐘頻率計數器

 

示例子代碼如下

 

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

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