Maison  >  Article  >  développement back-end  >  Pourquoi `std::chrono::high_resolution_clock` affiche-t-il des écarts malgré une résolution en nanosecondes ?

Pourquoi `std::chrono::high_resolution_clock` affiche-t-il des écarts malgré une résolution en nanosecondes ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-09 19:08:02286parcourir

Why Does `std::chrono::high_resolution_clock` Show Discrepancies Despite Nanosecond Resolution?

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!

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