Berechnung von Speicher einer Liste / Struktur

Für allgemeine Fragen zur Programmierung mit PureBasic.
Autonomus
Beiträge: 30
Registriert: 20.02.2015 18:21

Berechnung von Speicher einer Liste / Struktur

Beitrag von Autonomus »

Hallo PBler.

Habe eine Funktion die mir ausrechnen soll, wie viel der gesamte Inhalt einer Liste an Speicher verbraucht.
Ist mein Ansatz im Unicode so richtig oder wird dadurch ein Inhalt falsch berechnet?
Dem zugrunde liegen die Werte aus der PB Hilfe 5.4 im Bereich "Variablen, Typen und Operatoren".

Code: Alles auswählen

; Unicode
c_id.i + Len(Str(\Core_ID.i)) * 2
c_date.i + Len(\Core_Date.s) * 2
c_time.i + Len(\Core_Time.s) * 2
c_cat.i + Len(\Core_Entry.s) * 2
c_entry.i + Len(\Core_Entry.s) * 2
c_lng.i + Len(Str(\Core_Lng.l)) * 4

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86

c_int.i + Len(Str(\Core_Int.i)) * 4

CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64

c_int.i + Len(Str(\Core_Int.i)) * 8

CompilerEndIf

c_flt.i + Len(Str(\Core_Flt.f)) * 4
c_qud.i + Len(Str(\Core_Qud.q)) * 8
c_dbl.i + Len(Str(\Core_Dbl.d)) * 8
c_str.i + Len(\Core_Str.s) + 1
c_ls.i = c_id.i + c_date.i + c_time.i + c_cat.i + c_entry.i + c_lng.i + c_int.i + c_flt.i + c_qud.i + c_dbl.i + c_str.i
Die Multiplikationen beziehen sich dabei auf die Bytes pro Zeichen im Unicode Modus.

Danke an alle Mitdenker und Antwortende. :-)
[Aktuelles Projekt: Core Project | Media Library (Core Project based)]
  • OS: Windows 7 Ultimate x64 | PB: PureBasic 5.40 x86/x64

    CPU: AMD Phenom(TM) II X4 965 BE (4x 3.4GHz @3.8GHz) | GPU: nVidia GeForce 8200 (512MB), nVidia GeForce GT 730 (4096MB)
    RAM: 8GB | HDD: 250GB Samsung, 1TB Samsung
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von man-in-black »

Hi,

was sagst du zu "SizeOf()"? ;)

MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Autonomus
Beiträge: 30
Registriert: 20.02.2015 18:21

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von Autonomus »

Hey mib. :D

Dieser Befehl zeigt nur die Strukturgröße an und wenn ich die Ausgabe beobachte und die PB Hilfe richtig verstanden habe, dann ist SizeOf() ausschließlich die Ausgabe / Rückwert der Strukturfelder.
Nicht der eigentliche Inhalt.
[Aktuelles Projekt: Core Project | Media Library (Core Project based)]
  • OS: Windows 7 Ultimate x64 | PB: PureBasic 5.40 x86/x64

    CPU: AMD Phenom(TM) II X4 965 BE (4x 3.4GHz @3.8GHz) | GPU: nVidia GeForce 8200 (512MB), nVidia GeForce GT 730 (4096MB)
    RAM: 8GB | HDD: 250GB Samsung, 1TB Samsung
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von man-in-black »

Naja, dann sehe ich nicht so wirklich den Sinn in deiner Berechnung.
Auch wenn die Zahlen klein sind, wird trotzdem ein fester Speicher reserviert.
Durch das Umformen in Strings wirds nicht besser.

Dennoch kannst du mit SizeOf() die Speichergröße der nativen Typen ermitteln...

MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Autonomus
Beiträge: 30
Registriert: 20.02.2015 18:21

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von Autonomus »

Bin davon ausgegangen was unter "Variablen, Typen und Operatoren" und im Bereich "Unicode" steht.
Im Unicode Modus belegt jedes Zeichen 2 Byte.

Dein Verweis auf die Umwandlung in Strings ist mir bekannt.

Nur egal wie viel ich in die Liste schreibe, es verändert nicht die SizeOf() Ausgabe.
Wenn ich weitere Felder in die Struktur schreibe, dann verändert sich der Rückgabewert von SizeOf().
[Aktuelles Projekt: Core Project | Media Library (Core Project based)]
  • OS: Windows 7 Ultimate x64 | PB: PureBasic 5.40 x86/x64

    CPU: AMD Phenom(TM) II X4 965 BE (4x 3.4GHz @3.8GHz) | GPU: nVidia GeForce 8200 (512MB), nVidia GeForce GT 730 (4096MB)
    RAM: 8GB | HDD: 250GB Samsung, 1TB Samsung
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von man-in-black »

Mal von "normalen" Strings abgesehen, musst das Programm erst Speicher reservieren, bevor es darin Daten ablegen kann.
Bei PB passiert es, wenn eine Variable das erste mal an eine Struktur/Dateityp gebunden wird.
Ergo steht die Größe der Struktur schon fest, bevor du überhaupt die Möglichkeit hast, SizeOf() darauf anzuwenden.
Einmal festgelegt, ändert sich nichtsmehr an der Größe nativer Typen. Nurnoch der Inhalt.
Übersteigt der Wert einer Variable ihre Kapazität, springt der Wert zurück (oder es passieren andere tolle Sachen^^).

Bei Strings ists anders. Da kannst du ruhig mit Len() arbeiten. Der Inhalt der Strings wird zB nicht direkt in der Struktur gespeichert.
(Statt einem festen Wert, kannst hier Len()*SizeOf(Character) nehmen. Das ist aber nur eine Nährung! Abschließende 0 ...)

MFG
MIB

P.S.: Eine Speicherberechnung macht eigt erst Sinn, wenn du Strukturen und dynamische Objekte koppelst. LL ...
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von mhs »

Du kannst die Größe so berechnen:

Code: Alles auswählen

Structure sABC
  a.s
  b.s
  c.i
EndStructure

NewList Items.sABC()

AddElement(Items()) : Items()\a = "Hallo" : Items()\b = "Welt" : Items()\c = 1
AddElement(Items()) : Items()\a = "Guten" : Items()\b = "Tag"  : Items()\c = 2
AddElement(Items()) : Items()\a = "A"     : Items()\b = "B"    : Items()\c = 3

Define.i Size

ForEach Items()

  Size + SizeOf(sABC)

  Size + StringByteLength(Items()\a) + SizeOf(Character)
  Size + StringByteLength(Items()\b) + SizeOf(Character)

Next

Debug "Gesamtgröße: " + Str(Size) + " Byte"
Durch das Size + SizeOf(sABC) wird auch der Speicherbedarf für die Zeiger der Strings mit berechnet. Allerdings ist der weitere Overhead der Liste und Strings nicht mit dabei. Wenn du nur den tatsächlichen Inhalt möchtest, dann müsstest du das alternative Size + SizeOf(sABC\c) verwenden.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von GPI »

Damit berechnest du aber nur die Datengröße der einzelnen Einträge, vergisst aber den Verwaltungsaufwand.

Ein Eintrag in eine Linked List hat mindestes zwei Integer-Werte mehr. Nämlich einen Zeiger auf das nächste und das vorherige Element (ist irgendwo in der Hilfe erklärt). Zudem muss PB noch minimum die Position des aktuellen Elements speichern. Weitere Infos sind auch noch möglich. bspw. macht es Sinn in einer internen Variable die Anzahl der Elemente zu speichern.

Aber mal dumme Frage an den Threadersteller - warum willst du das eigentlich berechnen?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Berechnung von Speicher einer Liste / Struktur

Beitrag von mhs »

GPI hat geschrieben:Damit berechnest du aber nur die Datengröße der einzelnen Einträge, vergisst aber den Verwaltungsaufwand.
Ist mir bekannt :)
mhs hat geschrieben:... Allerdings ist der weitere Overhead der Liste und Strings nicht mit dabei. ...
Der Threadersteller hat geschrieben, dass er den "gesamten Inhalt" der Liste berechnen möchte und ich denke das deckt es ab.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Antworten