Maison >développement back-end >C++ >Pourquoi std::chrono::high_resolution_clock dans Visual Studio 2012 signale-t-il une résolution supérieure aux mesures observées ?

Pourquoi std::chrono::high_resolution_clock dans Visual Studio 2012 signale-t-il une résolution supérieure aux mesures observées ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-13 14:35:03508parcourir

Why does std::chrono::high_resolution_clock in Visual Studio 2012 report a higher resolution than observed measurements?

Précision de mesure incohérente avec std::chrono::high_resolution_clock

Question :

Dans le programme de test donné, le std::chrono::high_resolution_clock signale une résolution de 100 nanosecondes, mais le le temps mesuré pris par std::cout dépasse systématiquement 1 microseconde. Pourquoi la résolution attendue ne correspond-elle pas aux mesures observées ?

Réponse :

Si Visual Studio 2012 est utilisé, le std::chrono::high_resolution_clock est de typedef' d à system_clock, qui a une résolution limitée d’environ 1 milliseconde. Cette divergence est à l'origine de l'incohérence observée.

Résolution :

Pour obtenir une synchronisation haute résolution dans Visual Studio 2012, une horloge alternative qui utilise QueryPerformanceCounter doit être utilisée. Le code suivant fournit un exemple :

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

Cette HighResClock peut être utilisée de manière interchangeable avec des horloges standard, fournissant la synchronisation haute résolution nécessaire fonctionnalité.

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!

Déclaration:
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