Maison  >  Article  >  développement back-end  >  Pourquoi la précision de « std::chrono::high_resolution_clock » diffère-t-elle des valeurs mesurées ?

Pourquoi la précision de « std::chrono::high_resolution_clock » diffère-t-elle des valeurs mesurées ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 06:14:02315parcourir

Why Does `std::chrono::high_resolution_clock`'s Precision Differ from Measured Values?

Pourquoi la précision de std::chrono::high_resolution_clock ne correspond-elle pas à la valeur mesurée ?

Problème :

Dans le programme de test suivant, le programme tente de mesurer le temps d'exécution de std::cout, mais les résultats de mesure obtenus ne sont pas cohérentes et durent toujours 1 ou 2 microsecondes. En effet, la précision de std::chrono::high_resolution_clock ne semble pas être de 100 nanosecondes, ou il y a un problème avec le code qui mesure le temps d'exécution de std::cout.

#include <iostream>
#include <chrono>

using std::chrono::nanoseconds;
using std::chrono::duration_cast;

int main()
{
    std::cout << "Resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num / 
                                          std::chrono::high_resolution_clock::period::den * 
                                          1000 * 1000 * 1000 << std::endl;

    auto t1 = std::chrono::high_resolution_clock::now();
    std::cout << "How many nanoseconds does std::cout take?" << std::endl;
    auto t2 = std::chrono::high_resolution_clock::now();

    auto diff = t2 - t1;
    nanoseconds ns = duration_cast<nanoseconds>(diff);

    std::cout << "std::cout takes " << ns.count() << " nanoseconds" 
              << std::endl;
}

Réponse :

Dans Visual Studio 2012, std::chrono::high_resolution_clock est défini comme system_clock, ce qui entraîne une mauvaise précision (environ 1 ms ). Pour une plus grande précision, l'horloge haute résolution personnalisée suivante peut être utilisée :

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(&amp;frequency);
        return frequency.QuadPart;
    }();
}

HighResClock::time_point HighResClock::now()
{
    LARGE_INTEGER count;
    QueryPerformanceCounter(&amp;count);
    return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));
}

Cette horloge peut être utilisée à la place de std::chrono::high_resolution_clock pour une mesure du temps de haute précision.

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