Größe von Arraylist

sTEk

Erfahrenes Mitglied
Ist es möglich, die Speicherbelgeung einer Arraylist in Erfahrung zu bringen?
Oder muss ich über die Größe der einzelnen Items und den Count der Arraylist auf die Größe schließen? (umständlich...)
 
Also ich glaube, da gibts keine Möglichkeit. Eigentlich sollte dich das auch nicht zu kümmern brauchen, wenn du bei nicht mehr benötigten Objekten "Dispose" aufrufst. Der Garbage Collector kümmert sich dann um den Rest.

Es gibt eine Methode, allerdings scheint die nicht wirklich brauchbare Ergebnisse zu liefern (vielleicht hab ich auch den Sinn und Zweck falsch verstanden?):

Code:
GC.GetTotalMemory()
 
GC.GetTotalMemory liefert den verwalteten (managed) allokierten Speicherbedarf des Prozesses zurück und nicht den gesamten Speicherbedarf.

Was die Größe von ArrayLists etc. betrifft: Nimm einen Profiler dafür.
 
Danke Dir.
Das mit dem Dispose ist mir in sofern unklar, als dass ich das auf ein ArrayList gar nicht anwenden kann.
Die Größe des ArryLists möchte ich wissen, da ich dieses ganz gern ab einer bestimmten Größe (da stehen mehr oder weniger komplexe Strukturen drin) abspeichern und neu initialisieren möchte.
 
Vergiss dieses Vorhaben. Du müsstest ein Profiling für die CLR schreiben und zur Laufzeit immer wieder gegen die CLR abfragen. Das kostet dich mehr als es bringt. Wenn du Sorgen bezüglich der Performance und/oder des zu erwarteten Speicherverbrauchs hast, dann musst du die verwendeten Strukturen und Typen entsprechend anpassen.
 
Das Problem daran ist, dass sich die Größe der Array-List nicht nur aus den enthaltetenen Objekten ergibt, die Arraylist selbst hat auch eine Größe. Das nur mal so am Rande.

Aber, um ganz ehrlich zu sein: Vergiss ArrayLists. Verwende List<T>! List<T> soll ArrayList in .NET 2.0 ablösen. Und ich gehe davon aus, dass du nicht mehr mit .NET 1.0/1.1 arbeitest?

mfg
 
Dispose: ArrayList implementiert kein IDisposable-Interface, ergo auch kein Dispose. Dispose wird hauptsächlich dann verwendet, wenn ein Objekt mit unmanaged Ressourcen arbeitet (siehe Dateizugriffe etc.). Diese müssen mitunter freigegeben werden. Bezüglich der ArrayList würde das bedeuten, dass dein Objekte IDisposable implementieren sollten wenn unmanaged Ressourcen verwendet würden.

Zu List<T>:
Der Vorteil liegt unter anderem darin, dass du hier voll typisiert arbeiten kannst, kein Boxing/Unboxing notwendig ist und zudem List<T> keinen Overhead mitbringt. Wenn du dich genauer darüber informieren möchtest, empfehle ich dir den Artikel ArrayList’s vs. generic List for primitive types and 64-bits von Josh Williams. (Nicht von den "64 bits" abschrecken lassen.
 
Danke schön!

Der Tipp mit dem List<T> war super - genau deswegen liebe ich dieses Forum, man bekommt immer wieder neue Impressionen und Lösungsvorschläge!
Ich habe mir jetzt die Belegung der in List<T> hinterlegten Klasse angesehen und rechne per Hand aus, ab wievielen Einträgen es langsam kritisch wird.
 
Zurück