Comme d'autres l'ont déjà noté, la fonction time () dans la bibliothèque standard C n'a pas une résolution meilleure qu'une seconde. La seule fonction C entièrement portable qui peut fournir une meilleure résolution semble être clock (), mais qui mesure le temps processeur plutôt que le temps d'horloge murale. Si l'on se contente de se limiter aux plateformes POSIX (par exemple Linux), la fonction clock_gettime () est un bon choix.
Depuis C ++ 11, il existe de bien meilleures fonctionnalités de synchronisation disponibles qui offrent une meilleure résolution sous une forme qui devrait être très portable sur différents compilateurs et systèmes d'exploitation. De même, la bibliothèque boost :: datetime fournit de bonnes classes de synchronisation à haute résolution qui devraient être hautement portables.
Un défi dans l'utilisation de l'une de ces fonctionnalités est le délai introduit par l'interrogation de l'horloge système. De l'expérimentation de clock_gettime (), boost :: datetime et std :: chrono, ce délai peut facilement être une question de microsecondes. Ainsi, lorsque vous mesurez la durée d'une partie de votre code, vous devez autoriser une erreur de mesure d'environ cette taille, ou essayer de corriger cette erreur nulle d'une manière ou d'une autre. Idéalement, vous souhaiterez peut-être rassembler plusieurs mesures du temps pris par votre fonction et calculer le temps moyen ou maximum / minimum pris sur de nombreuses exécutions.
Pour aider avec tous ces problèmes de portabilité et de collecte de statistiques, j'ai développé la bibliothèque cxx-rtimers disponible sur Github qui essaie de fournir une API simple pour chronométrer des blocs de code C ++, calculer zéro erreur et rapporter les statistiques de plusieurs temporisateurs intégrés dans votre code. Si vous avez un compilateur C ++ 11, vous #include <rtimers/cxx11.hpp>
utilisez simplement quelque chose comme:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
À la sortie du programme, vous obtiendrez un résumé des statistiques de synchronisation écrites dans std :: cerr, telles que:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
qui montre le temps moyen, son écart-type, les limites supérieure et inférieure et le nombre de fois que cette fonction a été appelée.
Si vous souhaitez utiliser des fonctions de synchronisation spécifiques à Linux, vous pouvez #include <rtimers/posix.hpp>
, ou si vous avez les bibliothèques Boost mais un ancien compilateur C ++, vous pouvez #include <rtimers/boost.hpp>
. Il existe également des versions de ces classes de temporisation qui peuvent collecter des informations de synchronisation statistiques sur plusieurs threads. Il existe également des méthodes qui vous permettent d'estimer l'erreur zéro associée à deux requêtes immédiatement consécutives de l'horloge système.
time()
renvoie donc une valeur différente.