C++ std::chrono::高分辨率时钟的分辨率不';t与测量值相对应

C++ std::chrono::高分辨率时钟的分辨率不';t与测量值相对应,c++,visual-studio-2012,c++11,chrono,C++,Visual Studio 2012,C++11,Chrono,让我通过这个测试程序问我的问题: #include <iostream> #include <chrono> using std::chrono::nanoseconds; using std::chrono::duration_cast; int main(int argc, char* argv[]) { std::cout << "Resolution (nano) = " << (

让我通过这个测试程序问我的问题:

#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 many nanoseconds does std::cout take?" << 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;
}
#包括
#包括
使用std::chrono::纳秒;
使用std::chrono::duration\u cast;
int main(int argc,char*argv[])
{
标准::cout

也许实现没有实现更高分辨率的计时器


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

我猜您使用的是Visual Studio 2012。如果不是,请忽略此答案。VisualStudio2012
typedef
高分辨率时钟
系统时钟
。遗憾的是,这意味着它的精度很差(大约1ms)。我编写了一个更好的高分辨率时钟,它使用了
QueryPerformanceCounter
,用于VisualStudio2012

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();
    };
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));
}
struct HighResClock
{
typedef长-长重复;
typedef标准::纳米周期;
typedef std::chrono::duration duration;
typedef std::chrono::time_point time_point;
静态常数布尔值为稳定=真;
静态时间点now();
};
HighResClock.cpp:

    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();
    };
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));
}
名称空间
{
const long g g_频率=[]()->long long
{
大整数频率;
QueryPerformanceFrequency(&frequency);
返回频率。四分之一;
}();
}
HighResClock::time\u point HighResClock::now()
{
大整数计数;
QueryPerformanceCounter(&count);
返回时间点(持续时间(count.QuadPart*static_cast(period::den)/g_频率);
}
(我省略了一个assert和#ifs,以查看它是否是根据上述代码在VisualStudio2012上编译的。)


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

时钟的分辨率不一定与时钟使用的数据类型所表示的最小持续时间相同。在这种情况下,您的实现使用的数据类型可以表示小至100纳秒的持续时间,但基础clock实际上没有这样的决心



HyLyRealStfyCalp[/Cuth]的低分辨率问题是几年来一直存在的问题。微软的C++标准库维护器Stephan T. Lavavej通过VisualStudio2015使用了<代码> QuealEnguleCurrEnter()来固定。

QPC函数是否也映射到std::chrono名称空间中的某个对象?@stefan:你的说法是什么?标准只是说“高分辨率时钟类的对象表示具有最短时钟周期的时钟。”它没有说在什么环境下——世界、系统或实现。在国际海事组织,这句话只是意味着没有其他实现提供的时钟可能更准确。特别是,如果系统时钟或稳定时钟更准确,那将是无效的。至于cppreference.com,它是一个社区编辑的wiki,没有任何规范意义g、 我不能回答这个问题,但无论如何,这段代码会产生正确的(纳秒精度)结果在我的机器上,所以问题最有可能出现在你的库实现中。相关:你在使用VS2012吗?@javapowered他们这么做是因为他们认为自己拥有太多的市场份额,并且想让人们不再使用VS。Visual Studio在很多方面都很糟糕,这就是其中之一。以上是高分辨率时钟的重要性在VS的标准库中实现…它也很简单,所以我不知道为什么他们只是去
typedef
'd它到
system\u clock
。也许它只是从裂缝中滑了出来。有趣的是,VC++2012实现已经被MS的标准库维护人员确认为一个bug。-()这个问题有一个bug,但还没有关于修复的消息-在此期间您可以一直使用boost。使用Visual Studio 2015,
std::chrono::high_resolution_clock
现在是
typedef
std::chrono::staid_clock
。直接从
typedef staid_clock high_resolution_clock;
添加到Mark的注释中-稳定时钟(扩展为高分辨率时钟)在VS2015中使用QueryPerformanceCounter。