2009-04-08 7 views
6

J'utilise perftools de google (http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html) pour le profilage CPU - c'est un outil merveilleux qui m'a permis d'effectuer de nombreuses améliorations de temps CPU sur mon application. Malheureusement, je suis arrivé au point que le code est encore un peu lent, et lorsqu'il est compilé en utilisant le niveau d'optimisation -3 de g ++, tout ce que je sais, c'est qu'une fonction spécifique est lente, mais pas les aspects qui sont lents .C++ profilage/optimisation: comment obtenir une meilleure granularité de profilage dans une fonction optimisée

Si je supprime le drapeau -O3, alors les parties non optimisées du programme dépassent cette fonction, et je n'obtiens pas beaucoup de clarté dans les parties réelles de la fonction qui sont lentes. Si je laisse le drapeau -O3 dans, alors les parties lentes de la fonction sont inline, et je ne peux pas déterminer quelles parties de la fonction sont lentes.

Des suggestions? Merci de votre aide!

Répondre

5

Si vous utilisez Linux, utilisez oprofile. Si vous utilisez Windows, utilisez les codes CodeAnalyst d'AMD. Les deux fourniront des profils basés sur des échantillons jusqu'au niveau des lignes de source individuelles ou des instructions d'assemblage et vous n'aurez aucun problème à identifier les «points chauds» dans les fonctions.

+0

Je ne peux pas parler pour CodeAnalyst, mais oprofile est incroyable! la commande opannotate m'a donné l'annotation de la ligne source comme vous l'avez décrit. Merci! – Adam

+1

CodeAnalyst est une interface graphique sur une version spécialisée d'oprofile. Vous pouvez également utiliser CodeAnalyst sous Linux. – Carlos

6

Pour quelque chose comme ça, je l'ai toujours utilisé la « vieille école » façon de le faire:

Insérer dans la routine que vous voulez mesurer à différents relevés de points qui mesurent l'heure actuelle (ou cputime). Il suffit ensuite d'imprimer ou de consigner les différences entre eux et vous saurez combien de temps chaque section de code a pris. De là, vous pouvez trouver ce qui mange la plupart du temps, et entrer et obtenir un timing précis dans cette section jusqu'à ce que vous sachiez quel est le problème et comment le réparer.

Si la surcharge de la fonction appelle est pas le problème, vous pouvez également forcer inline être hors de -fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inline (je suis sûr que pas exactement comment ces commutateurs interagissent les uns avec les autres, mais je pense qu'ils sont indépendants). Ensuite, vous pouvez utiliser votre profileur ordinaire pour regarder le profil du graphique d'appel et voir quels appels de fonctions prennent combien de temps.

+0

Merci Greg! Si cela n'avait pas été pour oprofile (ci-dessous), je pense que je serais allé pour l'idée de synchronisation de précision que vous avez suggéré. – Adam

1

J'ai passé des décennies à effectuer des réglages de performance.

Les gens aiment leurs outils, mais je le jure par this method.

Questions connexes