Seite 1 von 1

Berechnung von Speicher einer Liste / Struktur

Verfasst: 29.02.2016 15:08
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. :-)

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 29.02.2016 15:26
von man-in-black
Hi,

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

MFG
MIB

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 29.02.2016 15:29
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.

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 29.02.2016 15:34
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

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 29.02.2016 15:39
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().

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 29.02.2016 15:54
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 ...

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 29.02.2016 16:37
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.

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 12.03.2016 21:37
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?

Re: Berechnung von Speicher einer Liste / Struktur

Verfasst: 14.03.2016 08:42
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.