2016-06-21 1 views
1

J'aime essayer d'optimiser mon code, et je voudrais mesurer le temps pris par une fonction.VB NET Comment exécuter du code au début et à la fin d'une fonction

J'ai une classe nommée Chrono. Il me suffit donc d'ajouter chrono.start au début de la fonction, et chrono.stop à la fin. Ma classe ajoute aussi les temps qu'il mesure dans une liste, pour ensuite avoir le temps moyen, le temps total ...

Cela fonctionne. Le seul problème est quand il y a exit sub ou return au milieu de la fonction. Pas vraiment un problème, je viens d'ajouter un Try au début de la fonction, et mettre mon chrono.stop dans la partie finale. Je ne suis pas sûr que ce soit vraiment efficace, mais ça fonctionne.

Voici donc ma question: je voudrais avoir une fonction prenant le nom de la fonction en paramètre, qui lancera et arrêtera automatiquement ma classe lorsque cette fonction est appelée. J'ai entendu parler de Reflection, mais je n'ai aucune idée de comment l'utiliser. Et c'est vraiment difficile de chercher cette question sur internet (parce que les mots sont trop communs: "faire quelque chose à la fin d'une fonction")

En résumé, mon code fonctionne, pas de problème. C'est juste contraignant d'ajouter du code à une fonction pour une courte période de temps (et parfois oublié de l'enlever).

Thx (je suis français et espère que je suis compréhensible)

+1

La méthode correcte consiste à utiliser un profileur, sans rouler votre propre minuteur. –

+0

Je rembember il y a une façon AOP de le faire; De toute façon, si vous voulez juste mesurer les performances, vous pouvez essayer les outils de diagnostic VS. EDIT: Bien que l'AOP sera opt-in. –

+0

Je peux utiliser le profiler de Visual Studio. Cependant, le chargement de l'application est plus lent, il est donc long d'avoir les résultats car il mesure tout. Mais peut-être y a-t-il un moyen de lui dire ce qu'il faut mesurer ... Je vais m'y pencher. N'y at-il pas un moyen de le faire comme je l'ai demandé? –

Répondre

0

Voici comment vous pouvez utiliser la réflexion pour appeler une méthode par nom:

using System.Reflection; 

public int InvokeMethod(string name) 
{ 
    int time1 = 1; //call your chrono.start here. 
    Type thisType = this.GetType(); 
    MethodInfo theMethod = thisType.GetMethod(name); 
    theMethod.Invoke(this, new object[] { 1 }); 
    int time2 = 10; //call your chrono.end here. 
    return time2 - time1; 
} 

Cependant, il y a un problème. Comment saurez-vous quels paramètres passer à la fonction? Dans le code ci-dessus, je passe l'entier 1 (new object[] { 1 }) juste par exemple. Donc ce code ne peut pas être automatisé, mais si vous l'exécutez manuellement contre chaque fonction une par une, vous pouvez changer cette ligne pour passer les bons arguments et le faire fonctionner sans avoir à modifier votre fonction.

Ceci est pour répondre à votre question comment appeler une fonction par son nom en utilisant la réflexion. Cependant, il est beaucoup plus facile de l'appeler en utilisant un delegate (ou Fuc<T, tRsult> dans .Net v3.5 et supérieur).

+0

Bonjour. Merci pour votre réponse. Cependant, je voudrais DÉTECTER quand une fonction spécifique est lancée, et quand elle se termine. De cette façon, je pourrais commencer ma mesure juste avant que la fonction spécifiée soit lancée, et l'arrêter après son exécution. Je sais (approximativement) utiliser delegate pour démarrer une fonction à partir d'une autre fonction. –

+0

Oui, dans le code ci-dessus, remplacez la ligne 'int time1 = 1;' par votre 'chrono.start' et le' int time2 = 10; 'par votre' chroho.end' après, comme je l'ai dit dans les commentaires et vous obtenez exactement ce que vous vouliez. Vous pouvez obtenir exactement la même chose avec deligates, il suffit de remplacer les trois lignes entre 'time1' et' time2' avec l'appel au délégué. –

+0

De plus, l'appel d'une fonction via la réflexion va être significativement plus lent qu'un appel normal à cette fonction, donc cela va certainement vous faire perdre du temps. Les temps hors monde réel sont pires qu'inutiles. –