C ++ Windows中的高分辨率计时器库? [复制]

Posted

技术标签:

【中文标题】C ++ Windows中的高分辨率计时器库? [复制]【英文标题】:High resolution timer library in C++ Windows? [duplicate] 【发布时间】:2012-12-19 08:18:10 【问题描述】:

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

我正在开发一个从 ftp 下载文件的程序,并且正在寻找一个高分辨率计时器库来计算下载速度,目前我使用的是 c++ time(NULL),但结果不准确。

是否有一个简单/易于使用、即插即用的 Windows 平台 c++ 库?自上次通话后以秒为单位的时间或类似的东西。

编辑:

所以 QueryPerformanceCounter() 被多次提及,但是通过其他线程我发现了:

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

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

*我们还尝试为我们的线程修复线程亲和性,以确保每个线程始终从 QueryPerformanceCounter 获得一致的值,这很有效,但它绝对会影响应用程序的性能。 *

所以考虑到这种情况是否建议使用它?程序的性能和定时器的可靠性很重要

【问题讨论】:

正在展示... C++11 的... std::chrono! 【参考方案1】:

如果您没有陷入on the MSDN docs@ 备注中描述的错误用例,您就有了 QueryPerformanceCounter

示例来自: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;

【讨论】:

是的,看起来很麻烦。您可以指出我的任何工作示例或者包装类?【参考方案2】:

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

【讨论】:

他还可以详细说明您从使用 std::chrono 获得的好处(你知道,保证......)。 @BigBoss 我如何知道我的编译器是否支持 c++11 ?我什至不知道 c++11 是什么。【参考方案3】:

使用timeGetTime,分辨率应该可以满足你的需要。

【讨论】:

以上是关于C ++ Windows中的高分辨率计时器库? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

用于定期调用的现代高分辨率计时器

C中的最佳计时方法?

Windows 中的可等待计时器问题(timeSetEvent 和 CreateTimerQueueTimer)

Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

C GetTickCount(windows函数)到时间(纳秒)

Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现