L' StopWatch
de la classe ne doit pas être Disposed
ou Stopped
sur erreur. Ainsi, le code le plus simple pour le temps certains d'action est
public partial class With
{
public static long Benchmark(Action action)
{
var stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
}
Exemple de code d'appel
public void Execute(Action action)
{
var time = With.Benchmark(action);
log.DebugFormat("Did action in {0} ms.", time);
}
Je n'aime pas l'idée d'inclure les itérations dans l' StopWatch
code. Vous pouvez toujours en créer une autre méthode ou une extension qui gère l'exécution d' N
itérations.
public partial class With
{
public static void Iterations(int n, Action action)
{
for(int count = 0; count < n; count++)
action();
}
}
Exemple de code d'appel
public void Execute(Action action, int n)
{
var time = With.Benchmark(With.Iterations(n, action));
log.DebugFormat("Did action {0} times in {1} ms.", n, time);
}
Voici la méthode d'extension versions
public static class Extensions
{
public static long Benchmark(this Action action)
{
return With.Benchmark(action);
}
public static Action Iterations(this Action action, int n)
{
return () => With.Iterations(n, action);
}
}
Et l'exemple de code d'appel
public void Execute(Action action, int n)
{
var time = action.Iterations(n).Benchmark()
log.DebugFormat("Did action {0} times in {1} ms.", n, time);
}
J'ai testé les méthodes statiques et les méthodes d'extension (combinaison d'itérations et de référence) et le delta de l'exécution attendu le temps réel et le temps d'exécution est <= 1 ms.