Maison > développement back-end > C++ > 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
Libérer: 2024-11-09 19:08:02
original
356 Les gens l'ont consulté

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

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

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 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