如果當前系統中支援高解析度計數器,我們可以使用 QueryPerformanceCounter 和 QueryPerformanceFrequency 進行高解析度的計時。
QueryPerformanceFrequency()
類型:Win32API
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬體支援的高精度計數器的頻率。
傳回值:非零,硬體支援高精度計數器;零,硬體不支援,讀取失敗
函數QueryPerformanceCounter用於得到高精度計時器的值(如果存在這樣的計時器)
原型:BOOL QueryPerformanceCounter(LARGE_INTEGER *ipPerformanceCount);//參數指向計數器的值
參數: LARGE_INTEGER *ipProformanceCount
為一個指標變數用於函數傳值,即指向現時計數器的值.如果安裝的硬體不支援高精度計時器,該參數將返回0,
傳回值:
如果安裝的硬體支援高精度計時器,函數將返回非0值.
如果安裝的硬體不支援高精度計時器,函數將返回0
一個時間類的實現
View Code
// ------------------------------ header file -----------------------#pragma once#include <Windows.h>class CTime{private: CTime(void); ~CTime(void);public: static UINT64 GetMilliS();//毫秒 static UINT64 GetMicroS();//微秒 static UINT64 GetNanoS();//納秒private: static UINT64 m_frequency; static CTime m_self;};// -------------------------------- CTime.cpp ------------------------------#include "ctime.h"#include <assert.h>UINT64 CTime::m_frequency = 0;CTime CTime::m_self;CTime::CTime(void){ LARGE_INTEGER fc; if (!QueryPerformanceFrequency(&fc)) { assert(FALSE); } m_frequency = fc.QuadPart; //計時器的頻率}CTime::~CTime(void){}UINT64 CTime::GetMilliS(){ assert(m_frequency>1000); LARGE_INTEGER fc; if (!QueryPerformanceCounter(&fc)) { assert(FALSE); } UINT64 c = fc.QuadPart; UINT64 s = (c) / (m_frequency / 1000); return s;}UINT64 CTime::GetMicroS(){ assert(m_frequency>1000*1000); LARGE_INTEGER fc; if (!QueryPerformanceCounter(&fc)) { assert(FALSE); } UINT64 c = fc.QuadPart; UINT64 s = (c) / (m_frequency / 1000 / 1000); return s;}UINT64 CTime::GetNanoS(){ assert(m_frequency>1000*1000*1000); LARGE_INTEGER fc; if (!QueryPerformanceCounter(&fc)) { assert(FALSE); } UINT64 c = fc.QuadPart; UINT64 s = (c) / (m_frequency / 1000 / 1000 / 1000); return s;}
如果系統不支援高精度計時器,可以使用GetTickCount(),精度是毫秒。還可以使用clock(),其精度也是毫秒。