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