Heim  >  Artikel  >  Backend-Entwicklung  >  Warum unterscheidet sich die Präzision von „std::chrono::high_resolution_clock“ von den gemessenen Werten?

Warum unterscheidet sich die Präzision von „std::chrono::high_resolution_clock“ von den gemessenen Werten?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 06:14:02316Durchsuche

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

Warum stimmt die Genauigkeit von std::chrono::high_resolution_clock nicht mit dem gemessenen Wert überein?

Problem:

Im folgenden Testprogramm versucht das Programm, die Ausführungszeit von std::cout zu messen, die erhaltenen Messergebnisse sind jedoch nicht vorhanden konsistent und betragen immer 1 oder 2 Mikrosekunden. Dies liegt daran, dass die Genauigkeit von std::chrono::high_resolution_clock nicht 100 Nanosekunden zu betragen scheint oder es ein Problem mit dem Code gibt, der die Ausführungszeit von std::cout misst.

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

Antwort:

In Visual Studio 2012 ist std::chrono::high_resolution_clock als system_clock definiert, was zu einer schlechten Genauigkeit führt (ca. 1 ms). ). Für eine höhere Genauigkeit kann die folgende benutzerdefinierte hochauflösende Uhr verwendet werden:

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

Diese Uhr kann anstelle von std::chrono::high_resolution_clock für eine hochpräzise Zeitmessung verwendet werden.

Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die Präzision von „std::chrono::high_resolution_clock“ von den gemessenen Werten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn