2 Stimmen

Verbessert die Entsorgung von verwalteten Objekten die Leistung in .Net?

So implementiert Dispose() auf den verwalteten Objekten, wo die Leistung des Garbage Collectors verbessert würde, indem er einen Hinweis vom Garbage Collector erhält, um wahrscheinlich einen Teil seines gesamten Prozesses zu umgehen.

Ich sah dies Antwort zu einer Frage, die nicht viele Stimmen erhalten hat, aber stimmt das? Wenn ja, wie?

Nein, das ist falsch. Ich stimme mit Aaronaught überein. Darüber hinaus empfiehlt Microsoft in einem Webcast, den Don Box Mitte 2003 vorstellte, dass jeder .Net-Entwickler seine eigenen Objekte entsorgen sollte, unabhängig davon, ob sie verwaltet oder nicht verwaltet werden, da dies die Codeleistung um bis zu 20 % verbessert. Wenn es richtig gemacht wird, kann dies eine erhebliche Leistungsverbesserung sein. Es handelt sich also um eine Kernkompetenz, die jeder .net-Entwickler kennen und anwenden muss.

6voto

Jon Skeet Punkte 1325502

Sie sind einfach kann nicht Dispose des verwalteten Speichers auf die gleiche Weise wie der Aufruf Dispose zur Freigabe von Datei-Handles usw. Das Einzige, was den verwalteten Speicher aufräumen kann, ist der Garbage Collector.

Sie podría ein Dispose Methode setzen alle Variablen einer Klasse auf null in der Hoffnung, dass dies dem Garbage Collector ermöglicht, alle zuvor referenzierten Objekte früher einzusammeln - aber es gibt nur sehr wenige Situationen, in denen dies sinnvoll ist eigentlich helfen, da Ihr Objekt in der Regel ohnehin zur gleichen Zeit zur Abholung freigegeben wird. Es würde auch Ihren Code viel schwieriger zu folgen.

Die Fähigkeit zur nicht Die Tatsache, dass man sich in den meisten Fällen keine Gedanken über die Lebensdauer eines Objekts machen muss, ist einer der Vorteile von C# - warum sollte man das loswerden wollen, indem man jede Klasse implementiert? IDisposable ? Haben Sie wirklich Sie wollen "Eigentum" und Lebenszeit selbst verwalten?

Ich vermute, Sie haben die (zugegebenermaßen etwas unklare) Antwort, die Sie in Ihrer Frage zitiert haben, falsch verstanden. Ich glaube nicht, dass sie für die Entsorgung von alle Objekten - ich glaube, es geht darum, Instanzen von Typen explizit zu entsorgen, die bereits implementieren IDisposable . Dies hat nichts mit rein verwalteten Typen zu tun, die fast nie IDisposable .

3voto

Will Punkte 2502

Erstens wird durch den Aufruf von Dispose-Methoden dem GC in keiner Weise mitgeteilt, dass etwas Besonderes getan werden sollte. Dispose ist eine normale Methode, wie jede andere auch.

Der Clou ist die Funktion von Dispose, nämlich die Freigabe von Ressourcen, die nicht mehr benötigt werden.

Die Regel Nr. 1 bei IDisposable-Objekten ist der Aufruf von Dispose, wenn Sie mit ihnen fertig sind. Ja, der GC kann schließlich den Speicher leeren, aber wenn die Objekte noch mit anderen, die noch in Gebrauch sind, verknüpft sind, werden sie bleiben. Dispose bereinigt auch nicht verwaltete Ressourcen, was sehr wichtig ist, wie DB-Verbindungen, Datei-Handles, Sperren usw. Diese müssen unbedingt so schnell wie möglich geschlossen werden.

Kurz gesagt, wenn Sie ein IDisposable-Objekt instanziiert haben, entsorgen Sie es, wenn Sie fertig sind.

Ja, der Aufruf von Dispose ist mit Kosten verbunden, aber wie ich bereits erwähnt habe, bedeutet dies, dass Objekte voneinander entkoppelt werden können, so dass die GC sie bei der nächsten Ausführung freigeben kann. Es bedeutet auch, dass nicht verwaltete Ressourcen sofort freigegeben werden können. Ein weiterer Gewinn. Speicher- und Ressourcenlecks können die Leistung stark beeinträchtigen, ebenso wie Anwendungsabstürze, wenn es zu extrem wird!

Der Entwickler hat möglicherweise wichtige Ressourcen geschützt, also versuchen Sie bitte nicht, ihn in Frage zu stellen!

Das Profiling ist hier Ihr Freund. Wenn die Leistung der Neuerstellung dieser Objekte ein Problem darstellt, sollten Sie sie zwischenspeichern, aber dennoch darauf vorbereitet sein, sie zu entsorgen, wenn sie fertig sind.

3voto

basarat Punkte 230827

Wie von Jon Skeet hervorgehoben, handelt es sich bei diesem Code um schlechtes Code-Design:

 public class SomeClass : IDisposable
    {
        private string SomeData;

        public void LoadFileIntoMemory(string filename)
        {
            using (var sr = new StreamReader(filename))
            {
                SomeData = sr.ReadToEnd();
            }
        }
        public void DoSomethingWithDataInMemory()
        {
            //whatever
        }
        public void Dispose()
        {
            SomeData = null;
        }
    }

    class Program
    {
        public static void Main()
        {
            using (var sC = new SomeClass())
            {
                sC.LoadFileIntoMemory("somefile");
                sC.DoSomethingWithDataInMemory();
            }
        }
    }

Es ist viel besser, dies einfach zu tun

 public class SomeClass
    {
        private string SomeData;

        public void LoadFileIntoMemory(string filename)
        {
            using (var sr = new StreamReader(filename))
            {
                SomeData = sr.ReadToEnd();
            }
        }
        public void DoSomethingWithDataInMemory()
        {
            //whatever
        }
    }

    class Program
    {
        public static void Main()
        {
            var sC = new SomeClass();
            sC.LoadFileIntoMemory("somefile");
            sC.DoSomethingWithDataInMemory();
            sC = null;
        }
    }

IDisposable sollte unbedingt implementiert werden, wenn Ihre Klasse einige Ressourcen verwendet, die nicht gelöscht werden, wenn ein variabel für eine Instanz einer Klasse auf null gesetzt wird :) . Alle verwalteten Ressourcen werden gelöscht, wenn Sie die enthaltende Instanz auf null setzen (wenn die gc läuft).

0voto

Ovais Khatri Punkte 3073

Ja, dem stimme ich zu. Da der Garbage Collector die Aufgabe hat, den Speicher mit den nicht verwendeten Komponenten freizugeben, was er jedoch von Zeit zu Zeit tut, wenn der Entwickler selbst diese Aufgabe übernimmt, wird dies die Leistung dahingehend beeinträchtigen, dass ein zusätzliches Objekt nicht im Speicher verbleibt, obwohl der Speicher auf die Bereinigung durch den Garbage Collector wartet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X