AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Speicherplatz ermitteln: Objekt vs. Record
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherplatz ermitteln: Objekt vs. Record

Ein Thema von s.h.a.r.k · begonnen am 8. Mär 2010 · letzter Beitrag vom 9. Mär 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Speicherplatz ermitteln: Objekt vs. Record

  Alt 8. Mär 2010, 23:09
Hallo,

wollte allgemein mal nachfragen, wie ich den genauen Speicherplatz von einer Instanz einer Klasse (samt darin gekapselten Objekten) und einem Record (samt darin gekapselten Objekten) ermitteln kann?

Und zwar komme ich auf diese Frage, da RTTI in D2010 leider ein Problem mit meinem Record hat und ich in der Zwischenzeit kurz davor bin auf ein Klasse umzusteigen. Ich finde das im Prinzip zwar erst mal totaler Overhead, aber da habe ich dann doch lieber einen gut lesbaren Code, aber etwas weniger Performance. So viel verkraftet der Benutzer dann doch noch

Wenn ihr mir im Speziellen noch helfen wollte:
Delphi-Quellcode:
// ----- Record -----
RInteger = record
private
  FValue : Variant; // Kann durch Setter nur NULL werden oder eine Zahl beinhalten
  procedure SetValue(const AVar: Variant);
public
  const VarType = varInteger;
  property Value : Variant read FValue write SetValue;
  function IsNull(): Boolean;
end;

// ----- In eine Klasse gefasst -----
RInteger = class(TObject)
private
  FValue : Variant; // Kann durch Setter nur NULL werden oder eine Zahl beinhalten
  procedure SetValue(const AVar: Variant);
public
  const VarType = varInteger;
  property Value : Variant read FValue write SetValue;
  function IsNull(): Boolean;
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Speicherplatz ermitteln: Objekt vs. Record

  Alt 9. Mär 2010, 05:52
Hallo,

schnapp dir MemCheck oder FastMM4,
erzeuge die Klasse und den Record (New PRecord),
ohne sie wieder freizugeben.
Und schon zeigen dir beide Programme den exakten Speicherverbrauch an
(mem leak).


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Speicherplatz ermitteln: Objekt vs. Record

  Alt 9. Mär 2010, 08:38
Also mindestens sein Turbo Delphi ist das nicht nötig.

Es gibt eine globale Variable ReportMemoryLeaksOnShutdown
(könnte vllt. etwas anders heißen konnte ich grad nicht nachprüfen)

Setz die einfach beim Programmstart auf true und mach sonst soweit das gleiche was Hoika meinte.
(Instanz erzeugen und nicht freigeben)

Pass aber auf das nicht vorher schon irgendwelche mem-leaks da sind
(also vorher mal mit ReportMemoryLeaksOnShutdown = true ausführen, ohne die Instanz zu erzeugen)

Bei einer Klasse müsste auch InstanzeSize gehen (das klappt aber ja nicht, wenn du auch den Speicherverbrauch von Objekten, Strings usw. in der Klasse ermitteln willst)

Aber InstanzeSize (Klasse) und SizeOf (Record) kannst du für einen Vergleich nutzen, wenn beide den gleichen Inhalt haben.

MFG
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Speicherplatz ermitteln: Objekt vs. Record

  Alt 9. Mär 2010, 09:40
Moin,
was hältst du von einem PInteger?

Delphi-Quellcode:
RInteger = record
private
  FValue : PInteger;
public
  property Value : PInteger read FValue write FValue;
  function IsNull(): Boolean;
end;
MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#5

Re: Speicherplatz ermitteln: Objekt vs. Record

  Alt 9. Mär 2010, 10:52
Delphi-Quellcode:
RInteger = {packed} record
private
  FValue : Integer;
  FNull : Boolean;
public
  procedure SetNull(yes : Boolean = true);
  property Value : PInteger read GetValue write SetValue;
  property IsNull : Boolean read FNull write SetNull;
end;
Kleiner ist dagegen dann nur noch die Verwendung eines Wertes aus dem Wertebereich des Integers, welchen man dann als NULL ansieht.


Wenn man ein Objekt nur als Datenspeicher nutzt, dann ist der Record immer einen Hauch kleiner, da die Verwaltung des Objektes wegfällt.

Delphi-Quellcode:
type
  TRec = record
    a, b: Integer;
  end;
  TCls = class
    a, b: Integer;
  end;

ShowMessage(Format('%d %d', [SizeOf(TRec), TCls.InstanceSize]));
= 8 12

Die 4 zusätzlichen Byte sind die Referenz auf den Klassentypen,
dazu kommt dann noch ein bissl mehr an RTTI-Daten (ich denk mal, daß wird sich auch in der neuen RTTI nicht geändert haben).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Speicherplatz ermitteln: Objekt vs. Record

  Alt 9. Mär 2010, 11:46
Zitat von s.h.a.r.k:
wollte allgemein mal nachfragen, wie ich den genauen Speicherplatz von einer Instanz einer Klasse (samt darin gekapselten Objekten) und einem Record (samt darin gekapselten Objekten) ermitteln kann?
Das geht imo nur durch rekursives Durchlaufen deiner Objekte/Records, da Objektreferenzen immer nur 4 Byte groß sind und TObject.InstanceSize dies auch nur berücksichtigt. D.h., wenn du in TMyObjekt1 ein weiteres TMyObjekt2 erzeugst und in einer FeldVariablen speicherst, wird die Größe nur um 4 Byte steigen (die Größe deiner FeldVariablen).
Das würde aber zu einigen Problemen führen:
- dass eine Objektinstanz von mehreren anderen Stellen aus referenziert wird. Wie ermittelst du dann den Speicherverbrauch deiner referenzierenden Objekte?
- dass Objektinstanzen sich gegenseitig referenzieren. Welche Instanz verbraucht dann Speicherplatz von welcher anderen?
Alles in allem keine einfache Angelegenheit.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

Re: Speicherplatz ermitteln: Objekt vs. Record

  Alt 9. Mär 2010, 11:52
Okay, Prinzip verstanden Ich müsste dann halt evtl. auch noch jedes Variable rekursiv durchgehen, wenn es sich denn um ein Objekt handelt.

Wobei es scheinbar doch nicht soo viel mehr an Overhead ist, wie ich anfangs befürchtet hatte Es enstehen halt geschätzt ~10000 Objekte anstatt Records (was zuvor einfach Variablen waren, aber durch das NULL-Mapping-Problem eben zu Records wurden).

Hier das was ich via der FastMM-Methoder herausgefunden habe:
Code:
Record:
20 Bytes
-> bei 10000 Objekten -> 200000 Bytes ->195 KB

Objekt:
28 Bytes
-> bei 10000 Objekten -> 280000 Bytes -> 273 KB

=> 40% mehr
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz