QueryPerformanceCounter 和奇怪的结果

Posted

技术标签:

【中文标题】QueryPerformanceCounter 和奇怪的结果【英文标题】:QueryPerformanceCounter and weird results 【发布时间】:2015-07-09 19:04:23 【问题描述】:

我想使用 PerformanceCounter 来衡量我需要多少时间来执行某些操作。

总的来说,我对 PerformanceCounter 和 C++ 了解不多。我在这里找到了一些代码:

How to use QueryPerformanceCounter?

我得到了奇怪的结果。这是我的尝试:

#include <Windows.h>

// ...

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()

    LARGE_INTEGER li;
    if (!QueryPerformanceFrequency(&li))
        printf("QueryPerformanceFrequency failed!\n");

    PCFreq = double(li.QuadPart) / 1000.0;

    //printf("Performance counter resolution: %f", PCFreq);

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;


double GetCounter()

    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart - CounterStart) / PCFreq;


int main(int argc, const char** argv) 
    while (true) 
        StartCounter();
        Sleep(1000); // just a test
        printf("Query frame: %d\n", GetCounter());

        // ...
    

这是我带有负数的奇怪结果:

我的代码有什么问题?

【问题讨论】:

不要在 C++ 中使用printf 【参考方案1】:

你打印一个双精度浮点数,使用%f:

printf("Query frame: %f\n", GetCounter());

【讨论】:

天哪,我刚刚找到它...修复后它完美运行。 对于双打,它可能需要是 %lf,而不仅仅是 %f。另外不清楚为什么要将频率除以 1000,除非您希望显示以毫秒而不是秒为单位。类型转换的语法是错误的,例如你应该使用 PCFreq = (double)li.QuadPart / 1000.;

以上是关于QueryPerformanceCounter 和奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章

QueryPerformanceCounter 和奇怪的结果

QueryPerformanceCounter 状态?

使用 Queryperformancecounter 的最大延迟和抖动是多少?

QueryPerformanceCounter 返回负数

QueryPerformanceCounter 运行时错误

QueryPerformanceCounter 是不是保证在启动后给您时间?