Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Multidimensionales Array oder Packed Record ?

  Alt 23. Okt 2006, 13:44
Hi,
die DSDT Links beinhalten wohl ein paar .net Sachen. Die kannst du nur verwenden, wenn du selbst mit Delphi.Net arbeitest (nach deiner Signatur nicht der Fall). Aber auch in Delphi (Win32) hast du alles was du brauchst.
An sich bieten sich für unbekannte Längen immer Listen (und alle Abkömmlinge) an. Du kannst leicht dyn. Arrays erstellen und die auch immer um ein Element vergrößern, dass ist aber ein gaaanz schlechter Weg! Ein Array wird vom Speichermanager immer als ein ausreichend großes Stück Speicher angelegt, dass einfach die Länge des Arrays * sizeOf(Elemente) als Größe reserviert (plus 4 Byte für die gespeicherte Länge). Vergrößerst du nun dein Array um ein Element, so wird an einer anderen Stelle Speicher reserviert, der ein Element mehr aufnehmen kann, das alte Array dort rein kopiert und das alte Array gelöscht. Das bedeutet jede Menge Overhead.
Listen verwenden intern (i.d.R.) auch einfach Arrays, der Zugriff ist dabei aber gekapselt. An sich reserviert die Liste immer gleich viel mehr Speicher auf einmal. Die Liste merkt sich dabei die Länge des im Moment verwendeten Arrays und den Füllstand. Ist überschreitet letzterer einen gewissen Wert, so wird hier wieder eine ganze Menge Speicher reserviert. Der Overhead ist dabei ähnlich groß, wie der beim Erweitern um nur ein Element, kann aber auf den kompletten, neu reservierten Speicher (also gleich mehrere Elemente) umgelegt werden und ist dann pro Element eher gering. Vorallem hast du aber auch den Vorteil, dass sich die Liste darum kümmert. Dir kann die Arbeitsweise völlig egal sein. Da intern Arrays verwendet werden, kannst du zudem auch nahezu wahlfrei auf einzelne Elemente per Index zugreifen.

Hashlisten kennt Delphi.Win32 auch, allerdings in einer etwas weniger mächtigen Version. Es bietet sich hier die THashedStringList an. Hierbei handelt es sich (wie der Name unspektakulär verrät) um eine StringList, die die Schlüssel (Strings) anhand eines Hashes in ein Array einsortiert. Mittels der Eigenschaft Objects (oder z.B. durch die Methode addObject) kann einem String ein Referenz auf ein Objekt übergeben werden, welches sich dann sehr flink anhand des Strings finden lässt.

Dabei ist diese HashListe wohl nicht all zu optimal, jmd (weiß leider nicht mehr wer genau) hat mal ein paar Tests was die Perfomance angeht gemacht, ich glaube mich zu erinnern, dass die THashedStringList nur bis zu einer gewissen Anzahl von Elementen < 1 mio. an ihre Grenzen stößt und danach kaum schneller als eine normale TStringList arbeitet.
Besser ist es deswegen eher eine Alternative Lösung zu verwenden. Hier hatte (auch nur wenn ich mich richtig erinner) alzaimar mal eine HashList gepostet, die dann wohl etwas besser sein dürfte.

Gruß Der Unwissende
  Mit Zitat antworten Zitat