Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Automatisch disposen wenn Objekt nicht mehr gebraucht wird --> using
fortuneNext
myCSharp.de - Member



Dabei seit:
Beiträge: 45
Herkunft: Aachen

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.500

beantworten | zitieren | melden

Schau Dir usings an, IDisposable-Interface sowie die vorgeschlagene Implementierung laut Microsoft in der Schnittstellendokumentation.
Das dürfte am Schluss das gleiche Resultat sein.
private Nachricht | Beiträge des Benutzers
fortuneNext
myCSharp.de - Member



Dabei seit:
Beiträge: 45
Herkunft: Aachen

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.206
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Zitat von fortuneNext
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
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
fortuneNext
myCSharp.de - Member



Dabei seit:
Beiträge: 45
Herkunft: Aachen

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers