为了账号安全,请及时绑定邮箱和手机立即绑定

std :: chrono :: high_resolution_clock的分辨率与测量不对应

std :: chrono :: high_resolution_clock的分辨率与测量不对应

C++
月关宝盒 2019-10-11 10:27:53
让我通过这个测试程序问我的问题:#include <iostream>#include <chrono>using std::chrono::nanoseconds;using std::chrono::duration_cast;int main(int argc, char* argv[]){    std::cout << "resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num        / std::chrono::high_resolution_clock::period::den * 1000 * 1000 * 1000 << std::endl;    auto t1 = std::chrono::high_resolution_clock::now();    std::cout << "how much nanoseconds std::cout takes?" << std::endl;    auto t2 = std::chrono::high_resolution_clock::now();    auto diff = t2-t1;    nanoseconds ns = duration_cast<nanoseconds>(diff);    std::cout << "std::cout takes " << ns.count() << " nanoseconds" << std::endl;    return 0;}我的机器上的输出:分辨率(纳米)= 100std :: cout需要多少纳秒?std :: cout需要1000200纳秒结果是我收到1000200或1000300或1000400或1000500或1000600或2000600(= 1或2微秒)。显然,无论是分辨率std::chrono是不是 100毫微秒或我衡量的时间的方式std::cout是错误的。(例如,为什么我从来没有收到1到2微秒之间的信号1500000?)我需要C ++中的高分辨率计时器。操作系统本身提供了高分辨率计时器,因为我可以Stopwatch在同一台计算机上使用C#类以微秒级的精度进行测量。因此,我只需要正确使用操作系统所具有的高分辨率计时器即可!如何修复程序以产生预期的结果?
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

我猜你正在使用VS2012;如果不是,请忽略此答案。VS2012 typedef的high_resolution_clock到system_clock。可悲的是,这意味着它的精度很差(大约1毫秒)。我写了一个更好的高分辨率时钟,QueryPerformanceCounter用于VS2012。


HighResClock.h:


    struct HighResClock

    {

        typedef long long                               rep;

        typedef std::nano                               period;

        typedef std::chrono::duration<rep, period>      duration;

        typedef std::chrono::time_point<HighResClock>   time_point;

        static const bool is_steady = true;


        static time_point now();

    };

HighResClock.cpp:


namespace

{

    const long long g_Frequency = []() -> long long 

    {

        LARGE_INTEGER frequency;

        QueryPerformanceFrequency(&frequency);

        return frequency.QuadPart;

    }();

}


HighResClock::time_point HighResClock::now()

{

    LARGE_INTEGER count;

    QueryPerformanceCounter(&count);

    return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));

}

(我省略了一个断言和#ifs来查看上面的代码是否在2012年对其进行了编译)


您可以在任何地方以与标准时钟相同的方式使用此时钟。


查看完整回答
反对 回复 2019-10-11
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

时钟的分辨率不一定与可由时钟使用的数据类型表示的最小持续时间相同。在这种情况下,您的实现使用的数据类型可以表示持续时间仅为100纳秒,但是底层时钟实际上没有这样的分辨率。


high_resolution_clock多年来,Visual Studio的低分辨率一直是一个问题。微软的C ++标准库维护者Stephan T. Lavavej 表示,这已在VS2015中通过使用进行了修复QueryPerformanceCounter()。


查看完整回答
反对 回复 2019-10-11
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

也许实现未实现更高分辨率的计时器?


似乎您正在使用Windows(提到C#),因此,如果您使用计时器,并且确实在使用Windows,则可以使用QueryPerformanceFrequency和QueryPerformanceCounter。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 903 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信