首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 高精度計時:QueryPerformanceCounter 實作指南

     編輯:C++ 入門

C++ 高精度計時:QueryPerformanceCounter 實作指南

在 Windows 平台上,QueryPerformanceCounter (QPC) 配合 QueryPerformanceFrequency 提供微秒級甚至納秒級的高精度計時,遠優於 clock() 或 GetTickCount()。

核心 API

  • QueryPerformanceFrequency(&freq):獲取計數器頻率(每秒計數數),存於 LARGE_INTEGER freq。
  • QueryPerformanceCounter(&start):獲取當前計數值。
  • QueryPerformanceCounter(&end):獲取結束計數值。

時間計算公式

elapsed_ms = (end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart;
elapsed_us = (end.QuadPart - start.QuadPart) * 1000000 / freq.QuadPart;

完整範例程式

#include 
#include 
#include 
using namespace std;

int main() {
    // 設定輸出格式:固定小數點,10 位精度
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout << setprecision(10);

    LARGE_INTEGER freq, start, end;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&start);

    // ---- 待測試代碼區 ----
    for (int i = 0; i < 100000; ++i) {
        cout << " ";
    }
    // ----------------------

    QueryPerformanceCounter(&end);

    long long elapsed_ms = (end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart;
    double elapsed_sec = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart;

    cout << "Elapsed (ms): " << elapsed_ms << endl;
    cout << "Elapsed (s) : " << elapsed_sec << endl;

    system("pause");
    return 0;
}

注意事項

  1. 頻率固定:系統啟動後頻率不變,可在程式啟動時查詢一次並緩存。
  2. 防止溢位:QuadPart 為 64 位有號整數,長時間運行差值不會溢位。
  3. 多核心一致性:現代 Windows 保證 QPC 在所有核心間同步,可安全用於多執行緒計時。
  4. 精度:典型頻率 2~3 MHz,理論精度約 0.5 微秒。

跨平台替代方案

  • Linux/macOS:clock_gettime(CLOCK_MONOTONIC, &ts)(納秒精度)。
  • C++11 標準庫:std::chrono::high_resolution_clock(封裝了平台相關的高精度時鐘)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved