如果当前系统中支持高分辨率计数器,我们可以使用 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(),其精度也是毫秒。