Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringList oder dynamisches Array. (https://www.delphipraxis.net/166344-stringlist-oder-dynamisches-array.html)

MiKaEr 8. Feb 2012 20:31

StringList oder dynamisches Array.
 
hallo,

ich würde gerne wissen, welches dieser beiden dinge ressourcenschonender ist.

ich nutze grundsätzlich immer die TStringList. wäre ein dynamisches array nicht vielleicht besser?

Klaus01 8. Feb 2012 21:22

AW: StringList oder dynamisches Array.
 
Guten Abend,

kannst Du ja gerne selbst ausprobieren..

Zeit nehmen:
In einer Schleife 10000 Einträge in eine StringList einfügen,
zufällige Einträge wieder löschen.
Zeit erneut nehmen.

Das gleiche Spiel mit einem dynamischen Array.

Grüße
Klaus

Sir Rufo 8. Feb 2012 22:07

AW: StringList oder dynamisches Array.
 
Ein Blick in die Unit Classes gibt da schon eine ungefähre Auskunft:
Delphi-Quellcode:
unit System.Classes;

...

{ TStringList class }

  TStringList = class;

  PStringItem = ^TStringItem;
  TStringItem = record
    FString: string;
    FObject: TObject;
  end;

  PStringItemList = ^TStringItemList;
  TStringItemList = array of TStringItem;
  TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;

  TStringList = class(TStrings)
  private
    FList: TStringItemList;
Die Klasse TStringList kapselt also ein Array ;)

BTW quasi jede List-Klasse kapselt ein Array ;)

Die eigene Verwaltung in einem Array kann evtl. also tatsächlich schneller sein, dadurch wird die Handhabung aber umständlicher.

Furtbichler 9. Feb 2012 06:28

AW: StringList oder dynamisches Array.
 
Es kommt doch darauf an, welche Operation man wie oft benötigt.

Sehr oft lesen : Array besser
Hinten ran hängen: Array besser
Einfügen : StringList besser
Löschen : Stringlist besser
(Array = Array Of String)

Wer allerdings ein 'Array Of PString' verwendet, und alles hochoptimiert selbst umsetzt (quasi ein schnelleres TStringList) der könnte noch ein paar ms rausholen.

Gausi 9. Feb 2012 06:41

AW: StringList oder dynamisches Array.
 
Zitat:

Zitat von Furtbichler (Beitrag 1150013)
Hinten ran hängen: Array besser

Warum ist da ein Array besser? Wenn das Array voll ist, und der Speicher nach dem letzten Eintrag anderweitig belegt ist, muss das Array komplett umkopiert werden. Eine Stringlist ist da besser geeignet, da dort das zugrundeliegende Array bei einem "Überlauf" direkt um 25% vergrößert wird (Eigenschaft Capacity), damit nachfolgende Einfügeoperationen schneller ausgeführt werden können.
Zitat:

Zitat von Furtbichler (Beitrag 1150013)
Einfügen : StringList besser
Löschen : Stringlist besser

Da eine Stringlist ein Array kapselt, ist das egal. Umkopiert wird in jedem Fall.

Furtbichler 9. Feb 2012 07:30

AW: StringList oder dynamisches Array.
 
Zitat:

Zitat von Gausi (Beitrag 1150015)
Zitat:

Zitat von Furtbichler (Beitrag 1150013)
Hinten ran hängen: Array besser

Warum ist da ein Array besser?

Bei einem Array habe ich zwei Anweisungen (N++ und A[N] := S)
Bei einer Stringliste habe ich 4 (Alloc, Copy, N++ und A[N] := P). Eigentlich noch mehr, weil noch etwas mehr befüllt wird.

Von einem dynamischen und sich selbsttändig vergrößerden Array habe ich in Delphi noch nichts gehört.
Zitat:

Zitat:

Zitat von Furtbichler (Beitrag 1150013)
Einfügen : StringList besser
Löschen : Stringlist besser

Da eine Stringlist ein Array kapselt, ist das egal. Umkopiert wird in jedem Fall.
Nein. Bei einer Stringlist werden Pointer bewegt, bei einem Array ganze Strings... Oder? Öh... Na ja egal, jedenfalls öhm... Sie verwirren mich.

Ach nee, ein String ist ja ein Pointer... Aber auf jeden Fall gibts noch bookkeeping. Vielleicht, oder?

Was solls: Teste einfach mal. Ich hab hier auf dem Nettbook kein Delphi.

Gausi 9. Feb 2012 08:11

AW: StringList oder dynamisches Array.
 
Und das Array noch nicht ganz gefüllt ist, stimmt das, ja. Wenn aber Setlength aufgerufen werden muss, muss auch umkopiert werden. (Und weil man gelegentlich Fragen hört wie "Warum dauert for i := 0 to 100000 do setlength(myarray, length(myarray) + 1) so lange", weise ich da immer wieder gerne drauf hin. ;) )

Bei der Stringlist wird das Setlength "intelligenter" aufgerufen, da die Kapazität (length) nicht nur um 1 erhöht wird, sondern um 25%. Damit kommt man amortisiert auch auf eine konstante Laufzeit zum Einfügen eines Elements. Wenn man capacity vor dem Füllen passend setzt, dürfte das Verhalten im Wesentlichen mit dem eines normalen Arrays übereinstimmen.

Dass beim Array ganze Strings kopiert werden, glaube ich auch nicht. Wie das intern genau funktioniert, weiß ich zwar nicht, aber ein "Array", bei dem jeder Eintrag eine andere Länge haben kann, würde das Ansprechen eines beleibigen Elements per Index etwas aufwändiger machen. ;-)

Luckie 9. Feb 2012 08:18

AW: StringList oder dynamisches Array.
 
Zitat:

Zitat von MiKaEr (Beitrag 1149982)
ich würde gerne wissen, welches dieser beiden dinge ressourcenschonender ist.

Ich denke, dass man das heute vernachlässigen kann. Und bevor man an diesen Stellen seinen Quellcode optimiert, sollte man sein Augenmerk und seine Zeit auf andere Aspekte der Programmierung richten. Als da wären: Sicherheit, Stabilität, Nutzerfreundlichkeit. Und was den Quellcode angeht: Einfachheit, Wiederverwendbarkeit, Wartbarkeit, Leserlichkeit.

Gausi 9. Feb 2012 09:32

AW: StringList oder dynamisches Array.
 
Um das nochmal klarzustellen: Wenn man mit einem dynamischen Array of String vernünftig umgeht, und beim Befüllen des Arrays nicht ständig setLength aufruft, ist das voll und ganz in Ordnung.
Bei einer Stringlist passiert das von alleine. Allerdings gibt es da z.B. den Stolperstein mit "sorted". Wenn man das am Anfang auf True setzt, und dann die Liste Stück für Stück befüllt, ist das keine gute Idee.

Da im Prinzip beide Strukturen gleich sind (dynamische Arrays halt), sind sie von der grundlegenden Kopmplexität her gleichwertig. Man sollte nur bei einigen Dingen aufpassen bzw. etwas über die Funktionsweise wissen, um nicht auf die Nase zu fallen.

Ob die eine oder andere Struktur ein paar ms schneller ist oder ein paar Bytes spart ist in den allermeisten Fällen zu vernachlässigen. Da sind andere Dinge wichtiger, wie Luckie schon sagte. Ich arbeite in den meisten Fällen mit der Stringlist, da diese eine Reihe Methoden bietet, die ich für das Array of String selber implementieren müsste. :)

Iwo Asnet 9. Feb 2012 13:15

AW: StringList oder dynamisches Array.
 
Ich habe mal getestet: Ein Array ist (logischerweise) in jedem Fall schneller, und zwar um 5-40%.
(Append, ca 5%, Insert/Delete ca. 40%).

Ich habe dabei ein Array of String mit 10000 Elementen genommen. Für das Insert/Delete habe ich die Move-Operation mit einem Insert/Delete verglichen (immer das 0.te Element). Hier scheint sich der Overhead der Methode negativ auszuwirken.

Fazit: Der Preis, den man für eine sichere und dynamisch wachsende Liste bezahlt, ist hinreichend gering.

Wer oft löscht bzw. einfügt, sollte eh eine andere Struktur verwenden (verkettete Liste, Baum, Dictionary etc.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.
Seite 1 von 2  1 2      

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