2009-08-27 6 views
2

J'essaye de trouver une méthode qui mesurera et retournera le temps d'exécution d'une autre méthode. Fondamentalement, quelque chose comme ceci:Faire une méthode pour retourner le temps d'exécution d'une autre méthode

public void DoSomething(Int32 aNumber) 
{ /* Stuff happens */ } 

// 
// Somewhere else in code: 
TimeSpan executionTime = MyDiag.MeasureExecTime(DoSomething(5)); 

// Now executionTime contains how long DoSomething(5) took to execute, 
// e.g. 2.55463 seconds. 

Comment puis-je faire cela (la méthode MeasureExecTime)?

+1

en double de http://stackoverflow.com/questions/232848/wrapping-stopwatch-timing-with-a-delegate-or-lambda? –

+0

Comment est-ce un doublon à la question de Jeff sur la mesure via lambda? Et d'ailleurs, j'ai déjà accepté une réponse à cette question, trop de temps entre les mains? – Alex

+2

Le fait que la réponse acceptée soit presque identique à la réponse acceptée sur l'autre question me fait me demander si c'est une copie, c'est tout. Pas besoin d'être sarcastique à ce sujet. –

Répondre

6

Je viens de créer une telle méthode pour tester les performances en this SO question:

private static TimeSpan MeasureExecTime(Action action, int iterations) 
{ 
    action(); // warm up 
    var sw = Stopwatch.StartNew(); 
    for (int i = 0; i < iterations; i++) 
    { 
     action(); 
    } 
    return sw.Elapsed; 
} 

Utilisation:

MeasureExecTime(() => DoSomething(5), 100000); 

Voir la réponse de 280Z28 si vous ne voulez pas tester plus plus qu'une itération :-)

+0

C'était aussi ma question. J'ai en fait eu l'idée d'écrire ceci à partir de votre réponse (w/tests de performance) dans l'autre question. lol. – Alex

+0

Votre boucle for ajoute des frais généraux et peut déformer les résultats (mais pas de manière significative ...). Vous devriez démarrer le chronomètre avant action(), et le mettre en pause après –

+2

@Thomas, il a quelques défauts, mais appeler l'action avant chronomètre startnew n'est pas l'un d'entre eux. Vois ma réponse. –

7
public static TimeSpan MeasureExecTime(Action action) 
{ 
    Stopwatch stopwatch = Stopwatch.StartNew(); 
    action(); 
    return stopwatch.Elapsed; 
} 
+0

Tout aussi bien :) +1 – Alex

Questions connexes