QueryPerformanceFrequency() - 基本介紹
包含頭:windows.h
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬件支持的高精度計數器的頻率。
返回值:非零,硬件支持高精度計數器;零,硬件不支持,讀取失敗。
QueryPerformanceFrequency() - 技術特點供WIN9X使用的高精度定時器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求計算機從硬件上支持高精度定時器。
函數的原形是:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
LARGE_INTEGER 的定義:
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} u;
#if ! defined(NONAMELESSUNION) || defined(__cplusplus)
_ANONYMOUS_STRUCT struct {
DWORD LowPart;
LONG HighPart;
};
#endif /* NONAMELESSUNION */
LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
數據類型LARGEINTEGER既可以是一個作爲8字節長的整數,也可以是作爲兩個4字節長的整數的聯合結構,其具體用法根據編譯器是否支持64位而定。
一般的使用方法:
在定時前應該先調用QueryPerformanceFrequency()函數獲得機器內部計時器的時鐘頻率。接着在需要嚴格計時的事件發生前和發生之後分別調用QueryPerformanceCounter(),利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經歷的精確時間。
#include <stdio.h> /* printf */
#include <time.h> /* time_t, struct tm, difftime, time, mktime */
#include<windows.h>
int main ()
{
//用QueryPerformanceCounter()來計時 微秒
LARGE_INTEGER large_interger;
double fre;
__int64 c1, c2;
QueryPerformanceFrequency(&large_interger);
fre = large_interger.QuadPart;
QueryPerformanceCounter(&large_interger);
c1 = large_interger.QuadPart;
Sleep(800);
QueryPerformanceCounter(&large_interger);
c2 = large_interger.QuadPart;
printf("本機高精度計時器頻率%lf\n", fre);
printf("第一次計時器值%I64d 第二次計時器值%I64d 計時器差%I64d\n", c1, c2, c2 - c1);
//不乘1000得到s的結果
printf("計時%lf毫秒\n", (c2 - c1) * 1000 / fre);
return 0;
}