6
votes

C ++: Garder la trace de la fonction Times est appelée

Garder la trace du nombre de fois qu'une fonction est appelée est facile lorsque vous passez le comptoir sous forme d'argument dans la fonction. C'est aussi facile lorsque vous renvoyez un de la fonction appelée. Mais je ne veux pas aller dans cette voie. La raison derrière cela est que cela semble être une mauvaise programmation (laissant la fonction savoir trop d'informations). Y a-t-il un meilleur moyen de garder une bonne trace de combien de fois cette fonction a été appelée?

Je cherche juste des concepts que je pourrais étudier. Fournir des exemples de code n'est pas nécessaire, mais pourrait être utile. P>

EDIT: Je ne cherche pas réellement d'outils de profilage. Permettez-moi d'ajouter du code pour obtenir mon point de vue. Étant donné que la possibilité de se termine par FuncCounter, je n'ai aucun moyen de récupérer une variable de mycée qui incrètera FuncCounter. Je pourrais éventuellement revenir 1 de la mycée puis incrémenter Funcounter de cette façon, mais cela ne semble pas être une très bonne programmation. Y a-t-il une autre façon de le faire? P>

int main()
{
int funcCounter = 0;
char *mystring = "This is a silly function.";
myFunction(mystring);
cout << "Times function is called: " << funcCounter << endl;
    return 0;
}

void myFunction(char *mystring)
{
cout << mystring << endl;
}

c++

1 commentaires

Pourquoi? Cette réponse peut changer la réponse. Essai? Surveiller un serveur? Une analyse d'algorithme de jeter?


6 Réponses :


2
votes

Mauvais style de codage, mais peut-être ajouter des variables globales et si nécessaire les serrures mutex peuvent faire le tour.


0 commentaires

4
votes

Je ferais cela à l'aide d'un outil de profilage comme GCOV (qui est pour Linux). Ces programmes font le travail d'insertion de code dans votre programme pendant la compilation et vous donnent un rapport sur le nombre de fois qu'une fonction est appelée, où elle a été appelée et combien de temps le programme dépensé de cette fonction.


0 commentaires

3
votes

Cela ressemble à ce que vous cherchez est un profileur. Selon la plate-forme que vous utilisez, il existe une série d'outils disponibles qui peuvent vous aider à chasser les utilisations (AB) d'une routine.

Veuillez réviser votre question avec la plate-forme pour laquelle vous avez besoin d'outils de profilage.


2 commentaires

Cela me dérange beaucoup. Beaucoup de gens très compétents semblent répondre à une question basée sur ce qu'ils pensent que la question est à peu près (par opposition à ce qui a été demandé). Il y a plusieurs fois que vous êtes bien correct, mais il y a des moments dans lesquels vous avez totalement tort et à la fin de votre réponse est inutile (malgré l'éloigner par des dizaines de personnes). Répondez à la question comme indiqué et si vous avez quelque chose d'autre à ajouter, puis ajoutez-le après avoir répondu à la question initiale. Je m'excuse, je suis de mauvaise humeur aujourd'hui, veuillez pardonner mon explosion.


Complètement pardonné. J'ai moi-même été pardonné de loin, bien plus grand.



20
votes

avoir un variable statique dans votre fonction et continuez à l'incrémenter à chaque fois la fonction appelée.

void my_Function(void) {
    static unsigned int call_count = 0;
    call_count++;
}


2 commentaires

Quelle utilisation est une locale statique? Vous devez l'imprimer soit de l'intérieur de la fonction sous test ou d'y accéder avec un débogueur. Semble pas inutile pour moi ....


@Soapbox: Oui, c'est ce que tu fais.



3
votes

Si la fonction fait partie d'une classe, vous pouvez ajouter un compteur statique à la classe, plus un accesseur et / ou des fonctions de réinitialisation: xxx

la problème avec l'ajout d'un compteur statique à une fonction autonome est qu'il n'ya aucun moyen d'obtenir à la valeur.

Vous pouvez ajouter un global, bien sûr, mais au lieu d'un global brut, je suggérerais une instance de Un singleton contenant tout votre code de diagnostic et des données.


0 commentaires

3
votes

Utilisez une classe comme celle-ci, et simplement l'instancier en haut d'une fonction (ou tout autre bloc) comme est effectuée dans f () ci-dessous.

Remarque: il y en a Frais de surcharge pour GetTimeOdday () Vous pouvez donc utiliser une méthode de chronométrage différente, mais c'est un sujet complètement différent digne de sa propre question (et a été abordée avant). < Pré> xxx

sortie d'échantillon: xxx


0 commentaires