ホームページ >バックエンド開発 >C++ >`std::chrono::high_resolution_lock` の精度が測定値と異なるのはなぜですか?

`std::chrono::high_resolution_lock` の精度が測定値と異なるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-09 06:14:02373ブラウズ

Why Does `std::chrono::high_resolution_clock`'s Precision Differ from Measured Values?

std::chrono::high_resolution_ Clock の精度が測定値と一致しないのはなぜですか?

問題:

以下のテストプログラムでは、std::cout の実行時間を計測しようとしていますが、計測結果が得られません。一貫性があり、常に 1 または 2 マイクロ秒です。これは、std::chrono::high_resolution_ Clock の精度が 100 ナノ秒に達していないか、std::cout の実行時間を測定するコードに問題があるためです。

#include <iostream>
#include <chrono>

using std::chrono::nanoseconds;
using std::chrono::duration_cast;

int main()
{
    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;
}

答え:

Visual Studio 2012 では、std::chrono::high_resolution_ Clock が system_lock として定義されているため、精度が低くなります (約 1 ミリ秒) )。精度を高めるために、次のカスタム高解像度クロックを使用できます:

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(&amp;frequency);
        return frequency.QuadPart;
    }();
}

HighResClock::time_point HighResClock::now()
{
    LARGE_INTEGER count;
    QueryPerformanceCounter(&amp;count);
    return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));
}

このクロックは、高精度の時間測定のために std::chrono::high_resolution_ Clock の代わりに使用できます。

以上が`std::chrono::high_resolution_lock` の精度が測定値と異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。