精確獲取時間um級(QueryPerformanceCounter)

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


發佈了41 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章