Heim > Backend-Entwicklung > C++ > Warum zeigt „std::chrono::high_resolution_clock' trotz Nanosekunden-Auflösung Abweichungen?

Warum zeigt „std::chrono::high_resolution_clock' trotz Nanosekunden-Auflösung Abweichungen?

Mary-Kate Olsen
Freigeben: 2024-11-09 19:08:02
Original
317 Leute haben es durchsucht

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

std::chrono::high_resolution_clock Auflösungsdiskrepanz

Obwohl für die std::chrono::high_resolution_clock eine Nanosekundenauflösung angegeben wurde, kommt es zu Diskrepanzen bei der Messung von Zeitintervallen. Dies ist im bereitgestellten Testprogramm zu sehen, in dem die von std::cout gemeldete Zeit nicht genau im erwarteten Auflösungsbereich liegt.

Auflösung der Diskrepanz

Die Die Ursache für diese Diskrepanz liegt in der Implementierung von std::chrono::high_resolution_clock in Visual Studio 2012. In dieser Umgebung ist high_resolution_clock definiert als Alias ​​für system_clock, das eine Auflösung von etwa 1 Millisekunde hat.

Fix für Visual Studio 2012

Um einen wirklich hochauflösenden Timer in Visual Studio 2012 zu erhalten , eine benutzerdefinierte Implementierung einer hochauflösenden Uhr empfohlen:

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();
};
Nach dem Login kopieren

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));
}
Nach dem Login kopieren

Verwendung von Benutzerdefiniert Uhr

Die benutzerdefinierte HighResClock kann in verwendet werden anstelle von std::chrono::high_resolution_clock mit der gleichen Funktionalität. Durch die direkte Verwendung von QueryPerformanceCounter wird ein genaues hochauflösendes Timing bereitgestellt.

Das obige ist der detaillierte Inhalt vonWarum zeigt „std::chrono::high_resolution_clock' trotz Nanosekunden-Auflösung Abweichungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage