Heim > Artikel > Backend-Entwicklung > Warum unterscheidet sich die Präzision von „std::chrono::high_resolution_clock“ von den gemessenen Werten?
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(&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)); }
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!