How to use QueryPerformanceCounter?

后端 未结 4 1777
难免孤独
难免孤独 2020-11-22 08:36

I recently decided that I needed to change from using milliseconds to microseconds for my Timer class, and after some research I\'ve decided that QueryPerformanceCounter is

4条回答
  •  梦如初夏
    2020-11-22 09:07

    #include 
    
    double PCFreq = 0.0;
    __int64 CounterStart = 0;
    
    void StartCounter()
    {
        LARGE_INTEGER li;
        if(!QueryPerformanceFrequency(&li))
        cout << "QueryPerformanceFrequency failed!\n";
    
        PCFreq = double(li.QuadPart)/1000.0;
    
        QueryPerformanceCounter(&li);
        CounterStart = li.QuadPart;
    }
    double GetCounter()
    {
        LARGE_INTEGER li;
        QueryPerformanceCounter(&li);
        return double(li.QuadPart-CounterStart)/PCFreq;
    }
    
    int main()
    {
        StartCounter();
        Sleep(1000);
        cout << GetCounter() <<"\n";
        return 0;
    }
    

    This program should output a number close to 1000 (windows sleep isn't that accurate, but it should be like 999).

    The StartCounter() function records the number of ticks the performance counter has in the CounterStart variable. The GetCounter() function returns the number of milliseconds since StartCounter() was last called as a double, so if GetCounter() returns 0.001 then it has been about 1 microsecond since StartCounter() was called.

    If you want to have the timer use seconds instead then change

    PCFreq = double(li.QuadPart)/1000.0;
    

    to

    PCFreq = double(li.QuadPart);
    

    or if you want microseconds then use

    PCFreq = double(li.QuadPart)/1000000.0;
    

    But really it's about convenience since it returns a double.

提交回复
热议问题