Laden...

Automatisch disposen wenn Objekt nicht mehr gebraucht wird --> using

Erstellt von fortuneNext vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.904 Views
F
fortuneNext Themenstarter:in
45 Beiträge seit 2009
vor 8 Jahren
Automatisch disposen wenn Objekt nicht mehr gebraucht wird --> using

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

16.806 Beiträge seit 2008
vor 8 Jahren

Schau Dir usings an, IDisposable-Interface sowie die vorgeschlagene Implementierung laut Microsoft in der Schnittstellendokumentation.
Das dürfte am Schluss das gleiche Resultat sein.

F
fortuneNext Themenstarter:in
45 Beiträge seit 2009
vor 8 Jahren

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?

2.207 Beiträge seit 2011
vor 8 Jahren

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

W
872 Beiträge seit 2005
vor 8 Jahren

Ich würde Dir Minibench empfehlen. Richtiges Micro-Benchmarking ist viel komplizierter, als man auf den ersten Blick denkt.
Bei Deiner Methode zum Beispiel misst Du wahrscheinlich die Dauer für den JIT-Compiler mit.

F
fortuneNext Themenstarter:in
45 Beiträge seit 2009
vor 8 Jahren

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.