首页  >  文章  >  后端开发  >  尽管纳秒分辨率,为什么'std::chrono::high_resolution_clock”仍显示差异?

尽管纳秒分辨率,为什么'std::chrono::high_resolution_clock”仍显示差异?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-09 19:08:02286浏览

Why Does `std::chrono::high_resolution_clock` Show Discrepancies Despite Nanosecond Resolution?

std::chrono::high_resolution_clock 分辨率差异

尽管为 std::chrono::high_resolution_clock 指定了纳秒分辨率,但还是会出现差异测量时间间隔时。这可以在提供的测试程序中看到,其中 std::cout 报告的时间并不完全在预期的分辨率范围内。

解决差异

The造成这种差异的原因在于 Visual Studio 2012 上 std::chrono::high_resolution_clock 的实现。在此环境下,high_resolution_clock 被定义为 system_clock 的别名,其分辨率约为 1 毫秒。

针对 Visual Studio 2012 的修复

要在 Visual Studio 2012 上获得真正的高分辨率计时器,建议使用自定义高分辨率时钟实现:

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

自定义时钟的使用

自定义 HighResClock 可以用于代替具有相同功能的 std::chrono::high_resolution_clock 。通过直接利用 QueryPerformanceCounter,它可以提供准确的高分辨率计时。

以上是尽管纳秒分辨率,为什么'std::chrono::high_resolution_clock”仍显示差异?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn