Hallo,
ich möchte im Moment einen Microbenchmark für eine Funktion schreiben.
Aktuell tue ich das so:
Console.WriteLine(@"Calling " + System.Reflection.MethodBase.GetCurrentMethod().Name + @"...");
var stopWatch = new Stopwatch();
stopWatch.Start();
try
{
//...
// if... return
// if... return
}
finally
{
stopWatch.Stop();
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name + @" took " + stopWatch.Elapsed);
}
Finally ist nötig, weil zwischendurch viele Returns drin vorkommen.
Ich finde das irgendwie unschön. In C++ könnte man ein Benchmarkobjekt erstellen, dass im Constructor den Counter startet und im Destruktor beendet und ausgibt - da das Objekt am Ende der Methode sofort zerstört würde, würde also sofort der Destruktor auslösen. Eine sehr schöne Methode, da man nur am Anfang das Benchmarkingobjekt zu erstellen brauch und sich dann um nichts mehr kümmert.
Leider geht das in Managed Sprachen natürlich wegen dem GC nicht, das Objekt wird nicht unbedingt sofort zerstört. In Java kann man das "autodisposable"-Interface verwenden, um Objekte sofort zu zerstören, wenn sie keine Referenzen mehr haben - geht soetwas auch in C#?
Viele Grüße
fortuneNext
Schau Dir using
s an, IDisposable
-Interface sowie die vorgeschlagene Implementierung laut Microsoft in der Schnittstellendokumentation.
Das dürfte am Schluss das gleiche Resultat sein.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
habe das alles mal durchgelesen.
Im Prinzip würde using das ja genau tun, ich finds aber immernoch nicht schön, denn die gebenchmarkte Methode müsste komplett im Usingblock sein oder ich müsste das Objekt am Ende explizit disposen. Geht das nicht automatisch, wenn die Funktion fertig ausgeführt ist?
Geht das nicht automatisch, wenn die Funktion fertig ausgeführt ist?
Doch schon. Durch das using. Ich verstehe noch nicht, wieso das unschön ist. Eigentlich bringt dir using sehr "schönen" Code, wobei das immer subjektiv ist 😉.
Du kannst den Block im using ja in eine Methode packen. Dann hast du nur den Methodenaufruf mit dem using-objekt als Parameter im Using-Block.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Was mich daran stört, ist, dass ich im Prinzip immer an zwei Stellen Code einfügen muss statt nur an einer. Auch wenn es im Using-Fall nur eine Klammer am Ende der Funktion ist. Die implizite Zerstörung von Objekten wie in C++ benötigt das nicht.