![]() |
Speicherverbrauch eines Objektes
Hallo,
wie kann man den Speicherverbrauch eines Objektes ermitteln. z.B. wieviel Bytes braucht folgende Stringliste (Daten ((Text)) und Objekt-Innereien)
Delphi-Quellcode:
Als Ergbnis soll nicht die Summe der Buchstaben der 5 Zeilen(inkl. Zeilenumbruch) stehen
var strListe : TStringList;
Speicher : Integer; strListe := TStringList.Create; strListe.Add('Heute'); strListe.Add('ist'); strListe.Add('ein'); strListe.Add('schöner'); strListe.Add('Tag'); Speicher := Speicherverbrauch (strListe); dann könnte ich ja ein
Delphi-Quellcode:
verwenden.
Length (strListe.Text)
die TStringList hat ja selber einen overhead (Datentypen, Objekte, Vererbung, etc.) Gesucht ist die Summe von alldem. |
Re: Speicherverbrauch eines Objektes
Jedes Pascal-Object hat eine Methode
![]() |
Re: Speicherverbrauch eines Objektes
Für was brauchst du denn diese Information? Der belegte Speicher ist querfeldein verstreut und kein zusammenhängender Block, was z.B. ein einfaches Schreiben in einen Stream unmöglich macht (dafür gibt es ja SaveToStream).
Das dürfte hinkommen: TStringList.InstanceSize + StrList.Capacity * SizeOf(TStringItem) + (Length(StrList[0]) + 12) + (Length(StrList[1]) + 12) + ... + (Length(StrList[Count-1]) + 12) |
Re: Speicherverbrauch eines Objektes
@Dax
nach Deiner Aussage
Delphi-Quellcode:
müsste n1 <> n2 sein, n1 = n2 = 48
n1 := strListe.InstanceSize;
strListe.Add('Heute'); strListe.Add('ist'); strListe.Add('ein'); strListe.Add('schöner'); strListe.Add('Tag'); n2 := strListe.InstanceSize; @jbg Zitat:
Zitat:
darum kann ich mich nicht auch noch kümmern Zitat:
es ist nicht nur eine TStringList - das war nur ein einfaches Beispiel sondern die Klasse enthält zig andere Componenten und Listen deswegen denke ich, dass es noch eine allgemeinere Antwort darauf geben könnte |
Re: Speicherverbrauch eines Objektes
Moin!
Zitat:
Er gibt auch nur den Platz zurück, den die Instanz braucht für ihre Membervariablen und nix weiter. Selbst die Strings bei dem Beispiel TStringList wird intern in der Klasse nur mit 4 Byte angerechnet, da es ein Pointer ist. Und somit müsstest du theoretisch die Vererbungskette von dem Objekt rückwärts durchlaufen und bei jeder Klasse das InstanceSize aufsummieren - was dann immernoch nicht Daten wie z.B. Strings mit beinhaltet. Zitat:
MfG Muetze1 |
Re: Speicherverbrauch eines Objektes
@Muetze1
Zitat:
Ich reserviere mit Absicht Speicher, damit ich dadurch gewisse Erleichterungen habe Ich bekomme keinen Fehler - noch nicht Nun möchte ich wissen, wenn ich das Teil/Objekt 10000 am Tag aufrufe (was vorraussichtlich nicht passiert), wieviel Speicher dabei verwendet wird. Wenn ich weiss wieviel Speicher dabei benötigt wird, kann ich auch die Situation besser einschätzen. Ich habe eine Möglichkeit gefunden für TComponent's
Delphi-Quellcode:
Jedoch muss hier in der Vererbungshierarchie ein TComponent sein. mem := TMemoryStream.Create; try mem.WriteComponent (Form1); n := mem.Size; finally mem.Free; end; d.h. TForm ist von TComponent TStringList aber nicht Ich bin darauf gekommen, weil man auch von einer Persitenz eines Objektes reden kann/könnte - und diese kann man bestimmt durch eine Byte-Grösse beschreiben. Aber vielleicht gibt es doch noch was allgemeineres was für Alle, die nach TObjekt kommen, funktionieren könnte. |
Re: Speicherverbrauch eines Objektes
Moin!
Dir ist bewusst, dass WriteComponent das gleiche rausschreibt was nachher in deiner DFM Datei steht und somit keine verlässliche Grössenangabe ist sondern rein die Werte der Properties des Objektes ? Wenn du eine solche Einschätzung machen musst - dann bau ein Testprojekt was dein Objekt 100000 mal instanziiert und den Speicher alloziiert. Dann kannst du doch die Speicherdifferenz im Taskmanager "messen" und dann einen Richtwert ausrechnen pro Instanz... Grundlegend kann ich dir versichern das deine ganzen Bemühungen so überhaupt nichts bringen - da wäre die Erfolgsaussichten höher, wenn du einen eigenen Heap Memory Manager schreibst und versuchst die ganzen Alloziierungen zu zu ordnen zu den Objekten.... MfG Muetze1 |
Re: Speicherverbrauch eines Objektes
Zitat:
Zitat:
Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz