Die StopWatch
Klasse muss nicht Disposed
oder Stopped
fehlerhaft sein. So ist die einfachste Code zu Zeit einige Aktion ist
public partial class With
{
public static long Benchmark(Action action)
{
var stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
}
Beispiel für einen Anrufcode
public void Execute(Action action)
{
var time = With.Benchmark(action);
log.DebugFormat(“Did action in {0} ms.”, time);
}
Ich mag die Idee nicht, die Iterationen in den StopWatch
Code aufzunehmen. Sie können jederzeit eine andere Methode oder Erweiterung erstellen, die die Ausführung von N
Iterationen übernimmt .
public partial class With
{
public static void Iterations(int n, Action action)
{
for(int count = 0; count < n; count++)
action();
}
}
Beispiel für einen Anrufcode
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);
}
Hier sind die Versionen der Erweiterungsmethoden
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);
}
}
Und Beispiel für einen Anrufcode
public void Execute(Action action, int n)
{
var time = action.Iterations(n).Benchmark()
log.DebugFormat(“Did action {0} times in {1} ms.”, n, time);
}
Ich habe die statischen Methoden und Erweiterungsmethoden (Kombination von Iterationen und Benchmark) getestet und das Delta der erwarteten Ausführungszeit und der tatsächlichen Ausführungszeit beträgt <= 1 ms.