web-dev-qa-db-fra.com

Comment comparer les performances du code C ++?

Je commence à étudier sérieusement les algorithmes et les structures de données, et je souhaite apprendre à comparer les performances des différentes façons dont je peux implémenter les A & DT.

Pour les tests simples, je peux obtenir le temps avant/après que quelque chose fonctionne, exécuter cette chose 10 ^ 5 fois et faire la moyenne des temps de fonctionnement. Je peux paramétrer l'entrée par taille, ou échantillonner une entrée aléatoire, et obtenir une liste des temps de fonctionnement en fonction de la taille de l'entrée. Je peux sortir cela sous forme de fichier csv et le nourrir dans des pandas.

Je ne suis pas sûr qu'il n'y ait aucune mise en garde. Je ne sais pas non plus quoi faire pour mesurer la complexité espace.

J'apprends à programmer en C++. Existe-t-il des outils humains pour réaliser ce que j'essaie de faire?

12
alpha

Le code de référence n'est pas facile. Ce que j'ai trouvé le plus utile était bibliothèque de référence Google. Même si vous ne prévoyez pas de l'utiliser, il pourrait être bon de lire quelques exemples. Il a beaucoup de possibilités pour paramétrer le test, sortir les résultats dans un fichier et même vous renvoyer la complexité de notation Big O de votre algorithme (pour n'en nommer que quelques-uns). Si vous connaissez le framework de test Google, je vous recommande de l'utiliser. Il permet également de gérer l'optimisation du compilateur afin que vous puissiez être sûr que votre code n'a pas été optimisé.

Il y a aussi beaucoup de discussions sur le code de référence sur CppCon 2015: Chandler Carruth "Tuning C++: Benchmarks, and CPUs and Compilers! Oh My!" . Il existe de nombreuses informations sur les erreurs possibles que vous pouvez faire (il utilise également Google benchmark)

7
wdudzik

Il est spécifique au système d'exploitation et au compilateur (donc spécifique à l'implémentation). Vous pouvez utiliser des outils profilage , vous pouvez utiliser des outils de synchronisation, etc.

Sous Linux, voir time (1) , time (7) , perf (1) , gprof (1) =, pmap (1) , mallinfo (3) et proc (5) et environ Invocation de GCC .

Voir aussi this . Dans la pratique, assurez-vous que vos courses durent assez longtemps (par exemple au moins une seconde de temps dans un processus).

Sachez que optimisation des compilateurs peut transformer radicalement votre programme. Voir CppCon 2017: Matt Godbolt talk "Qu'est-ce que mon compilateur a fait pour moi récemment? Déboulonner le couvercle du compilateur"

5

Du point de vue de l'architecture, vous pouvez également comparer votre code C++ à l'aide de différents outils architecturaux tels que Intel Pin , perf tool . Vous pouvez utiliser ces outils pour étudier la dépendance de l'architecture de votre code. Par exemple, vous pouvez compiler votre code pour différents niveaux d'optimisations et vérifier l'IPC/CPI, les accès au cache et les accès au magasin de chargement. Vous pouvez même vérifier si votre code subit un impact sur les performances en raison des fonctions de la bibliothèque. Les outils sont puissants et peuvent vous donner des informations potentiellement énormes sur votre code.

Vous pouvez également essayer de désassembler votre code et étudier où votre code passe la plupart du temps et essayer d'optimiser cela. Vous pouvez examiner différentes techniques pour vous assurer que les données fréquemment consultées restent dans le cache et ainsi garantir un taux de réussite élevé.

Dites, vous vous rendez compte que votre code est fortement dominé par les boucles, vous pouvez exécuter votre code pour différentes limites de boucle et vérifier les métriques dans 2 cas. Par exemple, définissez la boucle à 100 000 et recherchez la mesure de performance souhaitée "X", puis définissez la boucle à 200 000 et recherchez la mesure de performance "Y". Maintenant, calculez Y-X. Cela vous donnera une bien meilleure idée du comportement des boucles, car en soustrayant les deux mesures, vous avez effectivement supprimé les effets statiques du code.

Disons que vous exécutez votre code 10 fois et avec une taille d'entrée utilisateur différente. Vous pouvez peut-être trouver le temps d'exécution par taille d'entrée utilisateur, puis trier cette nouvelle métrique dans l'ordre croissant, supprimer la première et la dernière valeur (pour supprimer les valeurs aberrantes), puis prendre la moyenne. Enfin, trouvez le coefficient de variance pour comprendre comment les temps d'exécution se comportent.

Sur une note secondaire, le plus souvent, nous finissons par utiliser le terme "moyenne" ou "moyenne arithmétique" imprudemment . Examinez la métrique que vous prévoyez de faire la moyenne et examinez les moyennes harmoniques, les moyennes arithmétiques et les moyennes géométriques dans chacun des cas. Par exemple, trouver la moyenne arithmétique des taux vous donnera des réponses incorrectes. Le simple fait de trouver des moyennes arithmétiques de deux événements qui ne se produisent pas également dans le temps peut donner des résultats incorrects. Utilisez plutôt des moyennes arithmétiques pondérées.

4
Yash Karundia