Maison > Article > développement back-end > Pourquoi `std::chrono::high_resolution_clock` affiche-t-il des écarts malgré une résolution en nanosecondes ?
std::chrono::high_resolution_clock Écart de résolution
Malgré la spécification d'une résolution nanoseconde pour std::chrono::high_resolution_clock, des écarts surviennent lors de la mesure des intervalles de temps. Cela peut être vu dans le programme de test fourni où le temps signalé par std::cout n'est pas précisément dans la plage de résolution attendue.
Résoudre l'écart
Le La cause de cet écart réside dans l'implémentation de std::chrono::high_resolution_clock sur Visual Studio 2012. Dans cet environnement, high_resolution_clock est défini comme un alias pour system_clock, qui a une résolution d'environ 1 milliseconde.
Correction pour Visual Studio 2012
Pour obtenir une minuterie vraiment haute résolution sur Visual Studio 2012 , une implémentation d'horloge haute résolution personnalisée est recommandé :
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)); }
Utilisation de Horloge
La HighResClock personnalisée peut être utilisée sur place de std::chrono::high_resolution_clock avec la même fonctionnalité. En utilisant directement QueryPerformanceCounter, il fournit un timing précis à haute résolution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!