Heim  >  Artikel  >  Backend-Entwicklung  >  Warum meldet std::chrono::high_resolution_clock eine niedrigere Auflösung als erwartet in Visual Studio 2012?

Warum meldet std::chrono::high_resolution_clock eine niedrigere Auflösung als erwartet in Visual Studio 2012?

Linda Hamilton
Linda HamiltonOriginal
2024-11-11 09:13:02452Durchsuche

Why Does std::chrono::high_resolution_clock Report Lower Resolution Than Expected in Visual Studio 2012?

Auflösungsdiskrepanz in std::chrono::high_resolution_clock

In einem Testprogramm, das entwickelt wurde, um die von std::cout benötigte Zeit zu messen, Die Ausgabe zeigt eine durchweg hohe Abweichung von der erwarteten 100-Nansekunden-Auflösung von std::chrono::high_resolution_clock. Stattdessen liegt die gemessene Dauer zwischen 1 und 2 Mikrosekunden. Diese Diskrepanz wirft Fragen zur gemeldeten Auflösung und zur Genauigkeit der Zeitmessmethode auf.

Faktoren, die die Auflösung beeinflussen

Die Auflösung einer Uhr, wie durch ihre Periode angegeben, ist die kleinste Zeiteinheit, die gemessen werden kann. Obwohl Visual Studio 2012 über einen hochauflösenden Takt verfügt, mangelt es dieser leider an Präzision, da sie typischerweise eine Auflösung von etwa 1 Millisekunde aufweist. Dies wird auf die Tatsache zurückgeführt, dass Visual Studio 2012 „high_resolution_clock“ in „system_clock“ umdefiniert, was von Natur aus eine geringere Präzision aufweist.

Alternative hochauflösende Uhr für Visual Studio 2012

Zur Lösung Aufgrund dieser Einschränkung kann mithilfe der vom Betriebssystem bereitgestellten Funktion QueryPerformanceCounter eine genauere hochauflösende Uhr implementiert werden. Die unten bereitgestellte HighResClock-Klasse behebt dieses Problem, indem sie QueryPerformanceCounter verwendet, um eine zuverlässige Uhr mit Präzision im Mikrosekundenbereich bereitzustellen:

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()
    {
        LARGE_INTEGER count;
        QueryPerformanceCounter(&amp;count);
        return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));
    }
};

namespace
{
    const long long g_Frequency = []() -> long long
    {
        LARGE_INTEGER frequency;
        QueryPerformanceFrequency(&amp;frequency);
        return frequency.QuadPart;
    }();
}

Diese alternative Uhr kann nahtlos in vorhandenen Code integriert werden und ermöglicht so eine hochauflösende Zeitmessung auch innerhalb die Einschränkungen von Visual Studio 2012.

Das obige ist der detaillierte Inhalt vonWarum meldet std::chrono::high_resolution_clock eine niedrigere Auflösung als erwartet in Visual Studio 2012?. 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