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

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

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

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

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!

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