Je veux savoir combien de temps une certaine fonction prend dans mon programme C ++ pour s'exécuter sous Linux . Ensuite, je veux faire une comparaison de vitesse. J'ai vu plusieurs fonctions de temps mais j'ai fini avec cela de boost. Chrono:
process_user_cpu_clock, captures user-CPU time spent by the current process
Maintenant, je ne suis pas clair si j'utilise la fonction ci-dessus, vais-je obtenir le seul temps que le processeur a passé sur cette fonction?
Deuxièmement, je n'ai trouvé aucun exemple d'utilisation de la fonction ci-dessus. Quelqu'un peut-il m'aider à utiliser la fonction ci-dessus?
PS: En ce moment, j'utilise std::chrono::system_clock::now()
pour obtenir le temps en secondes mais cela me donne des résultats différents en raison de la charge CPU différente à chaque fois.
clock_gettime
.. gcc définit les autres horloges comme suit:typedef system_clock steady_clock; typedef system_clock high_resolution_clock;
sous Windows, utilisezQueryPerformanceCounter
.Réponses:
C'est une méthode très facile à utiliser en C ++ 11. Vous devez utiliser à
std::chrono::high_resolution_clock
partir de l'en-<chrono>
tête.Utilisez-le comme ceci:
Cela mesurera la durée de la fonction.
REMARQUE: vous n'obtiendrez pas toujours le même timing pour une fonction. En effet, le processeur de votre machine peut être moins ou plus utilisé par d'autres processus exécutés sur votre ordinateur, tout comme votre esprit peut être plus ou moins concentré lorsque vous résolvez un exercice de mathématiques. Dans l'esprit humain, nous pouvons nous souvenir de la solution d'un problème mathématique, mais pour un ordinateur, le même processus sera toujours quelque chose de nouveau; ainsi, comme je l'ai dit, vous n'obtiendrez pas toujours le même résultat!
la source
high_resolution_clock
vous donnera le temps physique et réel nécessaire à l'exécution de votre fonction. Ainsi, lors de votre première exécution, votre CPU était moins utilisée que lors de la prochaine exécution. Par «utilisé», je veux dire quel autre travail d'application utilise le processeur.steady_clock
? N'est-il pas possible que cehigh_resolution_clock
soit une horloge non monotone?Voici une fonction qui mesurera le temps d'exécution de toute fonction passée en argument:
Exemple d'utilisation:
Production:
la source
high_resolution_clock
peut être un alias desystem_clock
(horloge murale),steady_clock
ou une troisième horloge indépendante. Voir les détails ici . Pour l'horloge du processeur,std::clock
peut être utiliséwindows.h
dans un projet C ++ non trivial. Concernantassert
tout d'abord: "quod licet iovi non licet bovi";). Deuxièmement, toutes les décisions prises dans la bibliothèque standard (datant parfois de plusieurs décennies) ne sont pas réellement considérées comme une bonne idée selon les normes modernes. Il y a une raison pour laquelle le concepteur de modules c ++ essaie très fort de ne pas exporter les macros par défaut.programme simple pour trouver le temps d'exécution d'une fonction.
la source
Dans le livre de Scott Meyers, j'ai trouvé un exemple d'expression lambda générique universelle qui peut être utilisée pour mesurer le temps d'exécution d'une fonction. (C ++ 14)
Le problème est que vous ne mesurez qu'une seule exécution, les résultats peuvent donc être très différents. Pour obtenir un résultat fiable, vous devez mesurer un grand nombre d'exécutions. D'après la conférence d'Andrei Alexandrescu à la conférence code :: dive 2015 - Writing Fast Code I:
Temps mesuré: tm = t + tq + tn + to
où:
tm - temps mesuré (observé)
t - le temps réel d'intérêt
tq - temps ajouté par le bruit de quantification
tn - temps ajouté par diverses sources de bruit
to - temps de surcharge (mesure, bouclage, fonctions d'appel)
D'après ce qu'il a dit plus tard dans la conférence, vous devriez prendre un minimum de ce grand nombre d'exécutions comme résultat. Je vous encourage à regarder la conférence dans laquelle il explique pourquoi.
Il existe également une très bonne bibliothèque de google - https://github.com/google/benchmark . Cette bibliothèque est très simple à utiliser et puissante. Vous pouvez consulter quelques conférences de Chandler Carruth sur youtube où il utilise cette bibliothèque dans la pratique. Par exemple CppCon 2017: Chandler Carruth «Going Nowhere Faster»;
Exemple d'utilisation:
EDIT: Bien sûr, vous devez toujours vous rappeler que votre compilateur peut optimiser quelque chose ou non. Des outils comme perf peuvent être utiles dans de tels cas.
la source
Un moyen simple pour les anciens C ++ ou C:
La précision du chronométrage en secondes est
1.0/CLOCKS_PER_SEC
la source
Par exemple, pour trouver tous les nombres premiers entre 1 et 100 millions, cela prend environ 1 minute et 40 secondes. Ainsi, le temps d'exécution est imprimé comme suit:
Le code est ici:
la source
Voici un excellent modèle de classe d'en-tête uniquement pour mesurer le temps écoulé d'une fonction ou de tout bloc de code:
En voici quelques utilisations:
Puisque la classe est un modèle, nous pouvons spécifier très facilement la façon dont nous voulons que notre temps soit mesuré et affiché. Il s'agit d'un modèle de classe d'utilité très pratique pour faire du benchmarking et est très facile à utiliser.
la source
stop()
fonction membre n'est pas nécessaire car le destructeur arrête le minuteur pour vous.test code
démarrage de la minuterie. Ensuite,test code
vous utilisez explicitement l'objet timer et appelez sa méthode stop. Vous devez l'invoquer manuellement lorsque vous voulezstop
la minuterie. La classe ne prend aucun paramètre. De plus, si vous avez utilisé cette classe comme je l'ai montré, vous verrez qu'il y a un minimum de temps entre l'appel àobj.stop
et sondestructor
.<chrono>
?Je recommande d'utiliser
steady_clock
ce qui est garanti pour être monotone, contrairementhigh_resolution_clock
.Production:
la source
Vous pouvez avoir une classe simple qui peut être utilisée pour ce type de mesures.
La seule chose à faire est de créer un objet dans votre fonction au début de cette fonction
et c'est tout. La classe peut être modifiée pour répondre à vos besoins.
la source
Comme aucune des réponses fournies n'est très précise ou ne donne des résultats reproductibles, j'ai décidé d'ajouter un lien vers mon code qui a une précision inférieure à la nanoseconde et des statistiques scientifiques.
Notez que cela ne fonctionnera que pour mesurer le code qui prend un temps (très) court à s'exécuter (alias, quelques cycles d'horloge à quelques milliers): s'ils fonctionnent si longtemps qu'ils sont susceptibles d'être interrompus par une interruption -heh- , alors il n'est clairement pas possible de donner un résultat reproductible et précis; la conséquence est que la mesure ne se termine jamais: à savoir, il continue à mesurer jusqu'à ce qu'il soit statistiquement sûr à 99,9% d'avoir la bonne réponse, ce qui ne se produit jamais sur une machine qui a d'autres processus en cours d'exécution lorsque le code prend trop de temps.
https://github.com/CarloWood/cwds/blob/master/benchmark.h#L40
la source
Si vous voulez sécuriser le temps et les lignes de code, vous pouvez faire de la mesure du temps d'exécution de la fonction une macro d'une ligne:
a) Implémentez une classe de mesure du temps comme déjà suggéré ci-dessus (voici mon implémentation pour Android):
b) Ajoutez une macro pratique qui utilise le nom de la fonction actuelle comme TAG (l'utilisation d'une macro ici est importante, sinon
__FUNCTION__
évaluera à laMeasureExecutionTime
place de la fonction que vous voulez mesurerc) Écrivez votre macro au début de la fonction que vous souhaitez mesurer. Exemple:
Ce qui aboutira à la sortie suivante:
Notez que ceci (comme toutes les autres solutions suggérées) mesurera le temps entre le moment où votre fonction a été appelée et son retour, pas nécessairement le moment où votre CPU exécutait la fonction. Cependant, si vous ne donnez aucune modification au planificateur pour suspendre votre code en cours d'exécution en appelant sleep () ou similaire, il n'y a aucune différence entre les deux.
la source