web-dev-qa-db-fra.com

Obtenez l'heure locale en nanosecondes

Duplicata possible:
fonction de minuterie C++ pour fournir le temps en nano secondes

J'ai besoin de mesurer la durée d'exécution d'une fonction en résolution nanosecondes. C'est possible? Notre matériel informatique et nos logiciels ordinaires sont capables de donner une telle précision dans le temps? Si oui, comment y parvenir avec c ++? Est-ce possible avec la bibliothèque Boost?

14
Narek

Oui, aujourd'hui, la plupart des matériels prennent en charge ce type de résolution, et la bibliothèque standard C++ dispose d'une API qui peut également la prendre en charge. Malheureusement, toutes les implémentations de C++ ne le fournissent pas réellement.

L'API est le <chrono> bibliothèque introduite en C++ 11:

#include <iostream>
#include <chrono>

int main() {
    auto start = std::chrono::high_resolution_clock::now();

    // operation to be timed ...

    auto finish = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << "ns\n";
}

Le <chrono> l'implémentation dans libc ++ pour Darwin fournit une résolution en nanosecondes, mais il semble que l'implémentation dans VS2012 ne va qu'aux dixièmes de millisecondes. Le code ci-dessus donnera toujours des temps en termes de nanosecondes, mais des temps inférieurs à 100 microsecondes finiront par être de zéro nanosecondes.

Boost fournit également une implémentation, boost :: chrono, qui semble utiliser des nanosecondes sous Windows. Il est également utilisable avec C++ 03.

#include <boost/chrono.hpp>

int main() {
    boost::chrono::high_resolution_clock::time_point t1 =
        boost::chrono::high_resolution_clock::now();

    boost::chrono::high_resolution_clock::time_point t2 =
        boost::chrono::high_resolution_clock::now();

    std::cout << boost::chrono::duration_cast<boost::chrono::nanoseconds>(t2-t1) << "\n";
    // boost chrono has more advanced output, .count() isn't needed, nor is manually writing out the units
}
42
bames53

Le mieux que vous puissiez faire avec l'API Windows est QueryPerformanceCounter . Vous pouvez obtenir sa résolution avec QueryPerformanceFrequency . Selon la situation, cela peut être utilisé l'instruction RDTSC du CPU, auquel cas la fréquence est fondamentalement la fréquence d'horloge du CPU. Dans d'autres cas, il utilise une horloge distincte avec une fréquence de 1,024 MHz, donc la résolution est fondamentalement d'une microseconde.

C++ 11 ajoute une classe chrono qui peut également être utile - en supposant que vous utilisez un compilateur qui l'a déjà. Si votre compilateur ne fournit pas d'implémentation, Boost Chrono est un substitut raisonnable qui fonctionne avec la plupart des compilateurs/bibliothèques existants. Encore une fois, il n'y a aucune garantie qu'il fournira une résolution en nanosecondes, mais je m'attends à ce que sous Windows, ce soit probablement un wrapper portable autour de QPC/QPF, donc il donnera probablement la même résolution qu'eux, juste plus facilement.

3
Jerry Coffin

Je ne sais pas si vous recherchez une horloge ou une heure différée, mais l'une d'entre elles devrait être celle que vous recherchez:

http://www.cplusplus.com/reference/clibrary/ctime/clock/

http://www.cplusplus.com/reference/clibrary/ctime/difftime/

Vous pouvez utiliser ces fonctions avant et après et comparer les différences de temps d'exécution pour voir le temps d'exécution global d'une fonction.

2
mttalxndrgrrtt

Et bien sûr il y a aussi le bon vieux Boost :: date_time :

#include <boost/date_time/posix_time/posix_time.hpp>

boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();

microsec seulement, cependant.

0
Offirmo