Maison > développement back-end > C++ > le corps du texte

Pourquoi std::chrono::high_resolution_clock signale-t-il une résolution inférieure à celle attendue dans Visual Studio 2012 ?

Linda Hamilton
Libérer: 2024-11-11 09:13:02
original
450 Les gens l'ont consulté

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

Écart de résolution dans std::chrono::high_resolution_clock

Dans un programme de test conçu pour mesurer le temps pris par std::cout, la sortie révèle un écart constamment élevé par rapport à la résolution attendue de 100 nanosecondes de std::chrono::high_resolution_clock. Au lieu de cela, la durée mesurée varie de 1 à 2 microsecondes. Cet écart soulève des questions sur la résolution rapportée et sur la précision de la méthode de mesure du temps.

Facteurs affectant la résolution

La résolution d'une horloge, telle que rapportée par sa période, est la plus petite unité de temps qu’il puisse mesurer. Bien que Visual Studio 2012 inclut une horloge haute résolution, celle-ci manque malheureusement de précision, affichant généralement une résolution d'environ 1 milliseconde. Cela est attribué au fait que Visual Studio 2012 redéfinit high_resolution_clock en system_clock, qui a intrinsèquement une précision inférieure.

Horloge haute résolution alternative pour Visual Studio 2012

Pour répondre Cette limitation, une horloge haute résolution plus précise peut être implémentée à l'aide de la fonction QueryPerformanceCounter fournie par le système d'exploitation. La classe HighResClock fournie ci-dessous résout ce problème en utilisant QueryPerformanceCounter pour offrir une horloge fiable avec une précision de l'ordre de la microseconde :

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;
    }();
}
Copier après la connexion

Cette horloge alternative peut être intégrée de manière transparente dans le code existant, permettant une mesure du temps haute résolution même dans les contraintes de Visual Studio 2012.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal