C ++ Windows中的高分辨率计时器库?

时间:2012-12-19 08:18:11

标签: c++

  

可能重复:
  C++ high precision time measurement in Windows

我正在开发一个从ftp下载文件的程序,我正在寻找一个High-Res计时器库来计算下载速度,现在我正在使用c ++时间(NULL),但结果并不准确。

是否有一个简单/易用,插入N播放的Windows平台的c ++库?自上次通话或类似事件以来,在几秒钟内完成的时间。

修改

所以QueryPerformanceCounter()被多次提到过,但是通过其他线程这就是我发现的:

应该警告您它是基于CPU频率的。例如,当频率不稳定时启用省电模式。如果要使用此API,请确保CPU处于固定频率。

但请注意,英特尔的SpeedStep技术可能会在没有您的代码注意的情况下改变PerformanceFrequency

*我们还尝试修复线程的线程亲和性,以保证每个线程始终从QueryPerformanceCounter获得一致的值,这可以工作,但它绝对杀死了应用程序中的性能。 *

因此,考虑到这种情况,建议使用它吗?程序的性能和计时器的可靠性非常重要

3 个答案:

答案 0 :(得分:3)

你有QueryPerformanceCounter,前提是你没有涉及备注on the MSDN docs

中描述的错误用例

示例来自:How to use QueryPerformanceCounter?

#include <windows.h>

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

答案 1 :(得分:2)

如果你有一个支持C ++ 11的编译器,那么你可以简单地使用std::chrono,如果没有,那么boost::chrono就是你的服务

答案 2 :(得分:1)

使用timeGetTime,解决方案应该足以满足您的需求。