Mesurer le temps d'exécution d'une fonction en C++
Je veux savoir combien de temps une certaine fonction dans mon programme C++ pour exécuter sur Linux. Par la suite, je veux faire une comparaison de la vitesse . J'ai vu plusieurs fois en fonction, mais a terminé avec cela à partir 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, aurai-je le seul temps qui CPU passé sur cette fonction?
Deuxièmement, je ne pouvais pas trouver un exemple d'utilisation de la fonction ci-dessus. Quelqu'un peut-il m'aider comment faire pour utiliser la fonction ci-dessus?
P. S: pour l'instant , je suis en utilisant std::chrono::system_clock::now()
obtenir le temps en secondes, mais cela me donne des résultats différents en raison des différentes charge CPU à chaque fois.
- Pour Linux utilisation:
clock_gettime
.. gcc définit d'autres horloges que:typedef system_clock steady_clock; typedef system_clock high_resolution_clock;
sur Windows, utilisezQueryPerformanceCounter
. - N'est-ce pas la question d'un duplicata de ce one ou de faire les scénarios d'apporter des solutions différentes?
- J'ai deux implémentations d'une fonction et que vous souhaitez trouver ce qui fonctionne mieux.
Vous devez vous connecter pour publier un commentaire.
Il est un très facile à utiliser la méthode en C++11. Vous devez utiliser
std::chrono::high_resolution_clock
de<chrono>
en-tête.L'utiliser comme ceci:
Cela permettra de mesurer la durée de la fonction.
REMARQUE: Ce n'est pas une exigence pour obtenir le même résultat toujours parce que le PROCESSEUR de votre machine peut être moins ou plus de utilisée par d'autres processus en cours d'exécution sur votre ordinateur. Comme vous permettrait de résoudre des exercices de maths, votre esprit peut être plus ou moins concentré, de sorte que vous aurez à résoudre que d'un autre temps. Dans l'esprit humain, nous pouvons nous souvenir que la solution d'un problème mathématique, mais pour un ordinateur, le même processus est toujours quelque chose de nouveau, donc, comme je l'ai Dit, il n'est pas nécessaire pour obtenir toujours le même résultat!
high_resolution_clock
va vous donner le physique et le temps réel que votre fonction nécessaire pour exécuter. Ainsi, dans le premier passage, votre PROCESSEUR est utilisé de moins que lors de la prochaine course. Par "utilisé", je veux dire ce que les autres travaux d'application utilise le CPU.Voici une fonction qui permettra de mesurer le temps d'exécution d'une fonction passée en argument:
Exemple d'utilisation:
De sortie:
high_resolution_clock
peut être un alias desystem_clock
(horloge murale),steady_clock
ou un tiers indépendant de l'horloge. Voir les détails ici. Pour le processeur de l'horloge,std::clock
peut être utiliséassert
), et aussi où est le préfixe dansassert
? nom commun? n'oubliez pas que vous êtes celui qui sera le codage de cette chose, si vous êtes inquiet au sujet de conflit vous-même un nom défini commefooWhatever
, vous devriez arrêter de codage et de faire autre chose à la place (parce que dans le codage, vous devrez définir beaucoup de noms, comment dangereux!!!, LOL). Votre temps sera mieux dépensé ailleurs. Puis de nouveau, d'accord d'être en désaccord.windows.h
dans un non-trivial projet c++. Concernantassert
tout d'abord: "quod licet iovi non licet bovi" ;). Deuxièmement, pas tous les processus de décision dans la bibliothèque standard (remontant parfois des décennies) sont effectivement une bonne idée par rapport aux normes modernes. Il y a une raison,pourquoi le c++ modules designer essayer très dur de ne pas exporter les macros par défaut....
Dans le cas où cela n'est pas clair: Mon bœuf n'est pas avec vous quelque chose qui s'appelle par exempletimeNow()
ouduration
, mais que c'est une macro, lorsqu'une fonction normale que d'obéir normal les règles de recherche et les espaces de noms ferait l'affaire. Et la définition de type pourrait être locale à lafuncTime
fonction, comme il n'est pas utilisé n'importe où d'autre, ou vous pouvez simplement utiliser l'auto et pas besoin d'un typedef à tous.programme simple de trouver une fonction de temps d'exécution prises.
De Scott Meyers livre que j'ai trouvé un exemple de générique universel expression lambda qui peut être utilisé pour la fonction de mesure du temps d'exécution. (C++14)
Le problème est que vous ne mesurer qu'une exécution afin que les résultats peuvent être très différents. Pour obtenir un résultat fiable, vous devriez mesurer un grand nombre de l'exécution.
Selon Andrei Alexandrescu à la conférence de code::plongée 2015 de la conférence de Rédaction de Rapide Code que j'ai:
Temps mesuré: tm = t + tq + tn + à
où:
tm - mesuré (observé) temps
t - le temps réel de l'intérêt
tq - temps ajouté par quantification du bruit
tn - temps ajouté par diverses sources de bruit
de tête de temps (mesure, les boucles, les fonctions d'appel)
Selon ce qu'il a dit plus tard dans le cours, vous devriez prendre un minimum de ce grand nombre de de l'exécution de votre résultat.
Je vous encourage à regarder la conférence, dans lequel il explique pourquoi.
Il y a aussi une très bonne bibliothèque à partir de google - https://github.com/google/benchmark.
Cette bibliothèque est très simple à utiliser et puissant. Vous pouvez payer quelques cours de Chandler Carruth sur youtube où il est l'utilisation de cette bibliothèque dans la pratique. Par exemple CppCon 2017: Chandler Carruth “Va Nulle part plus Vite”;
Exemple d'utilisation:
EDIT:
Bien sûr, vous avez toujours besoin de vous rappeler que votre compilateur peut optimiser quelque chose ou pas. Des outils comme perf peuvent être utiles dans de tels cas.
Moyen facile pour les vieux C++ ou C:
Précision de la synchronisation en quelques secondes et est
1.0/CLOCKS_PER_SEC
Par exemple, pour trouver tous les nombres premiers entre 1 et 100 millions de dollars, il faut environ 1 minute et 40 secondes.
Si le temps d'exécution est imprimée comme:
Le code est ici:
Voici un excellent en-tête uniquement modèle de classe pour mesurer le temps écoulé d'une fonction ou de tout bloc de code:
Voici quelques utilisations de celui-ci:
Depuis la classe est un modèle, nous pouvons spécifier réel facilement dans la façon dont nous voulons que notre temps pour être mesuré & affiche. C'est un utilitaire très pratique modèle de classe pour faire le bench-marking et est très facile à utiliser.
stop()
fonction de membre n'est pas nécessaire car le destructeur s'arrête la minuterie pour vous.test code
commence la minuterie. Puis, après votretest code
vous utilisez explicitement l'objet timer et appeler sa méthode stop. Vous devez appeler manuellement lorsque vous voulezstop
de la minuterie. La classe ne prend aucun paramètre. Aussi, si vous avez utilisé cette classe, tout comme je l'ai montré, vous verrez qu'il y est un minimum de délai de temps entre l'appel deobj.stop
et sesdestructor
.<chrono>
?