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

C++ 微秒級代碼運行時間測量:QueryPerformanceCounter RAII 封裝

     編輯:關於C語言

背景

GetTickCount/timeGetTime 精度僅 ~10-15ms,無法測量微秒級代碼段。Windows 提供高精度計數器 QueryPerformanceCounter (QPC) + QueryPerformanceFrequency (QPF),基於 CPU 時鐘週期,精度可達納秒級。

RAII 封裝類 CPrintfCodeTime

class CPrintfCodeTime {
public:
    explicit CPrintfCodeTime(const char* vCodeName)
        : m_strName(vCodeName ? vCodeName : "")
    {
        LARGE_INTEGER t; QueryPerformanceCounter(&t);
        m_llStart = t.QuadPart;
    }

    ~CPrintfCodeTime() {
        LARGE_INTEGER tEnd, freq;
        QueryPerformanceCounter(&tEnd);
        QueryPerformanceFrequency(&freq);

        double elapsedMs = double(tEnd.QuadPart - m_llStart) * 1000.0 / freq.QuadPart;

        char buf[128];
        #ifndef __BORLANDC__
        sprintf_s(buf, "運行時間: %.3f ms\n", elapsedMs);
        #else
        sprintf(buf, "運行時間: %.3f ms\n", elapsedMs);
        #endif
        OutputDebugStringA((m_strName + buf).c_str());
    }

private:
    std::string m_strName;
    long long m_llStart;
};

使用示例

void heavyFunction() {
    CPrintfCodeTime timer("heavyFunction: "); // 構造即開始計時
    // ... 耗時操作 ...
} // 析構自動打印耗時到調試輸出

關鍵點

  1. 構造函數記錄起始計數,析構函數計算差值並輸出,利用作用域自動管理,無需手動調用開始/結束。
  2. LARGE_INTEGER.QuadPart 為 64 位計數值,防溢出。
  3. 頻率 freq 通常恆定,可靜態緩存避免重複查詢。
  4. OutputDebugStringA 輸出到調試器(Visual Studio 輸出窗口、DbgView 等),不干擾標準輸出。
  5. 跨平台替代:Linux 用 clock_gettime(CLOCK_MONOTONIC, ...),C++20 用 std::chrono::high_resolution_clock。

注意事項

  • QPC 在多核/變頻 CPU 上可能不單調,長時間測量建議鎖定核心或用 SetThreadAffinityMask。
  • 極短代碼段(<1μs)測量受系統調度干擾大,建議循環多次取平均。
  • sprintf_s 為 MSVC 安全版本,跨平台代碼用 snprintf。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved