2017-07-05 3 views
-2

Je veux mesurer le temps que prennent certains appels de fonction dans mon application. Pour cela j'utilise la classe Stopwatch et ça marche bien. Il ressemble à ceci:Mesure du temps de fonctions avec différentes signatures en C#

static readonly Stopwatch StopWatch = new Stopwatch(); 

StopWatch.Restart(); 
void func(); 
StopWatch.Stop(); 
Assert.Blabla 

Cependant je tape ce autour d'un grand nombre de fonctions. Y at-il un moyen de faire une fonction qui fait cela pour moi? J'ai essayé mais comme les signatures des fonctions sont toutes différentes je ne peux pas le comprendre. J'ai jeté un oeil à Func et Action, mais ils semblent exiger une signature fixe. Je voudrais quelque chose comme ceci:

CallAndMeasureFunction(func) 
+0

Oui, C# est un langage fortement typé, bien sûr vous avez besoin d'une signature fixe .... – Milney

+4

C'est ce qu'on appelle le profilage. Utilisez un outil de profilage .NET pour vous donner ces statistiques. Voir la réponse ici https://stackoverflow.com/questions/14019510/calculate-the-execution-time-of-a-method (series0ne réponse) – ojf

+0

Ou regarder dans une bibliothèque comme: https://github.com/petabridge/NBench – Milney

Répondre

1

Vous pouvez utiliser quelque chose comme ci-dessous:

définir une méthode qui prend votre délégué des méthodes actuelles d'entrée:

public static TimeSpan GetTimestampFor(Action action) 
    { 
     TimeSpan timestamp = new TimeSpan(0); 
     Stopwatch stopWatch = new Stopwatch(); 

     if (action != null) 
     { 
      stopWatch.Start(); 
      action.Invoke(); 
      stopWatch.Stop(); 

      timestamp = stopWatch.Elapsed; 
     } 

     return timestamp; 
    } 

et appellent comme ci-dessous:

var timeSpan = GetTimestampFor(() => {var xyz = ActualMethodForWhichTimeHasTobeMeasured()}); 

Avec ce code, vous pouvez mesurer l'exécution de chaque méthode temps

+0

Malheureusement, je ne peux pas utiliser Action car la valeur renvoyée n'est pas toujours nulle. – Frank

+1

Mise à jour du code ci-dessus. Ce code peut être utilisé pour n'importe quel type de méthode, que vous ayez un type de retour ou non. Si vous n'avez pas de type de retour, supprimez simplement {var xyz = et} – Sujith