Ich schreibe Code wie diesen und mache ein wenig schnelles und schmutziges Timing:
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
b = DoStuff(s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Sicherlich gibt es eine Möglichkeit , dieses Stück Zeitcode als fancy-schmancy .NET 3.0 Lambda zu nennen , anstatt (Gott bewahre) schneiden und es ein paar Mal einfügen und ersetzt die DoStuff(s)
mit DoSomethingElse(s)
?
Ich weiß, dass es so gemacht werden kann, Delegate
aber ich wundere mich über den Lambda-Weg.
Time
verhält sich wie eine statische Methode, bei der der gesamte vorhandene Statussw
verworfen wird. Die Einführung als Instanzmethode sieht also nur unübersichtlich aus.Stopwatch.StartNew
, die aus einem bestimmten Grund statisch ist. C # ist nicht in der Lage, vorhandenen Klassen statische Methoden hinzuzufügen (im Gegensatz zu F #), daher verstehe ich den Impuls, dies zu tun, aber es hinterlässt immer noch einen schlechten Geschmack in meinem Mund.Folgendes habe ich verwendet:
Verwendung:
quelle
Console.WriteLine("")
zum Testen unter zu verwenden// do stuff that I want to measure
, ist der Compiler überhaupt nicht glücklich. Sollen Sie dort normale Ausdrücke und Aussagen machen?Sie können versuchen, eine Erweiterungsmethode für die von Ihnen verwendete Klasse (oder eine beliebige Basisklasse) zu schreiben.
Ich würde den Anruf so aussehen lassen:
Dann die Erweiterungsmethode:
Jedes von DependencyObject abgeleitete Objekt kann jetzt TimedFor (..) aufrufen. Die Funktion kann einfach angepasst werden, um Rückgabewerte über ref-Parameter bereitzustellen.
- -
Wenn Sie nicht möchten, dass die Funktionalität an eine Klasse / ein Objekt gebunden wird, können Sie Folgendes tun:
Dann könnten Sie es wie folgt verwenden:
Andernfalls scheint diese Antwort eine anständige "generische" Fähigkeit zu haben:
StopWatch-Timing mit einem Delegierten oder Lambda einpacken?
quelle
Die
StopWatch
Klasse muss nichtDisposed
oderStopped
fehlerhaft sein. So ist die einfachste Code zu Zeit einige Aktion istBeispiel für einen Anrufcode
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 vonN
Iterationen übernimmt .Beispiel für einen Anrufcode
Hier sind die Versionen der Erweiterungsmethoden
Und Beispiel für einen Anrufcode
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.
quelle
Ich habe vor einiger Zeit eine einfache CodeProfiler-Klasse geschrieben, die Stopwatch umhüllte, um eine Methode mithilfe einer Aktion einfach zu profilieren: http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way
Außerdem können Sie den Multithread-Code problemlos profilieren. Im folgenden Beispiel wird die Aktion Lambda mit 1-16 Threads dargestellt:
quelle
Angenommen, Sie benötigen nur ein schnelles Timing für eine Sache, die einfach zu verwenden ist.
quelle
Sie können eine Reihe von Methoden überladen, um verschiedene Fälle von Parametern abzudecken, die Sie möglicherweise an das Lambda übergeben möchten:
Alternativ können Sie den Func-Delegaten verwenden, wenn er einen Wert zurückgeben muss. Sie können auch ein Array (oder mehrere) von Parametern übergeben, wenn für jede Iteration ein eindeutiger Wert verwendet werden muss.
quelle
Für mich fühlt sich die Erweiterung auf int etwas intuitiver an. Sie müssen keine Stoppuhr mehr instanziieren oder sich Gedanken über das Zurücksetzen machen.
Also hast du:
Mit der Beispielverwendung von:
Beispielausgabe:
quelle
Ich verwende gerne die CodeTimer-Klassen von Vance Morrison (einer der Performance-Typen von .NET).
Er schrieb einen Beitrag in seinem Blog mit dem Titel " Verwalteten Code schnell und einfach messen: CodeTimers ".
Es enthält coole Sachen wie einen MultiSampleCodeTimer. Es berechnet automatisch den Mittelwert und die Standardabweichung und ist auch sehr einfach, Ihre Ergebnisse auszudrucken.
quelle
quelle