Question

Je suis en cours d'exécution dans la question suivante lors de profilage d'une application sous VC6. Quand je profil de l'application, le profileur est indiquant qu'une méthode de lecture simple, similaire à ce qui suit est appelé plusieurs centaines de milliers de fois:

int SomeClass::getId() const
{
   return m_iId;
};

Le problème est, cette méthode n'est pas appelé nulle part dans l'application de test . Quand je change le code à ce qui suit:

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

Le profileur ne comprend jamais getId dans la liste des fonctions invoquées. Commentez la cout et je suis de retour à droite où j'ai commencé, plus de 130 mille appels! Juste pour être sûr qu'il n'a pas été certaines données de profileur en cache ou d'une table de recherche de fonction corrompue, je fais un nettoyage et la reconstruction entre chaque test. Toujours les mêmes résultats!

Toutes les idées?

Était-ce utile?

La solution

Je suppose que ce qui se passe est que le compilateur et / ou l'éditeur de liens est « coalescence » cette fonction très simple à une ou plusieurs autres fonctions identiques (le code généré pour return m_iId est probablement exactement la même chose que beaucoup d'autres getters qui arrivent à retourner un membre qui est au même décalage).

essentiellement, un tas de différentes fonctions qui se trouvent à avoir des implémentations identiques de code machine sont tous résolus à la même adresse, confondant le profileur.

Vous pouvez être en mesure d'empêcher que cela se passe (si cela est le problème) en désactivant les optimisations.

Autres conseils

Je suppose que vous caractérisez parce que vous voulez savoir s'il existe des moyens de rendre le programme prendre moins de temps, non? Vous n'êtes pas profiler juste parce que vous voulez voir les chiffres.

Il est simple, à l'ancienne, éprouvée et vraie façon de trouver des problèmes de performance. Alors que le programme est en marche, appuyez simplement sur le bouton « pause » et regardez la pile d'appel. Pour ce faire, à plusieurs reprises, comme de 5 à 20 fois. Le plus grand problème est, moins d'échantillons dont vous avez besoin de le trouver.

Certaines personnes demandent si ce n'est pas fondamentalement ce profileurs faire, et la réponse est que très peu. La plupart des profileurs tombent pour un ou des mythes les plus courants , de sorte que votre SpeedUp est limité parce qu'ils ne trouvent pas tous les problèmes:

  • Certains programmes passent du temps inutiles dans les « points chauds ». Lorsque tel est le cas, vous verrez que le code à la « fin » de la pile (où le compteur de programme est) est en train de faire le travail inutile.

  • Certains programmes font plus d'E / S que nécessaire. Si oui, vous verrez qu'ils sont en train de le faire d'E / S.

  • Les grands programmes sont souvent lents parce que leurs arbres d'appel sont inutilement touffue, et la taille de besoin. Si oui, vous verrez les appels de fonction inutile mi-pile.

Tout code que vous voyez sur un certain pourcentage des piles sera, si elle est renvoyée, sauf que le pourcentage de temps d'exécution (plus ou moins). Vous ne pouvez pas vous tromper. Voici un exemple , sur plusieurs itérations, d'économiser plus de 97 %.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top