AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi StringList oder dynamisches Array.
Thema durchsuchen
Ansicht
Themen-Optionen

StringList oder dynamisches Array.

Ein Thema von MiKaEr · begonnen am 8. Feb 2012 · letzter Beitrag vom 10. Feb 2012
Antwort Antwort
Seite 1 von 2  1 2      
MiKaEr
(Gast)

n/a Beiträge
 
#1

StringList oder dynamisches Array.

  Alt 8. Feb 2012, 21:31
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?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: StringList oder dynamisches Array.

  Alt 8. Feb 2012, 22:22
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: StringList oder dynamisches Array.

  Alt 8. Feb 2012, 23:07
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: StringList oder dynamisches Array.

  Alt 9. Feb 2012, 07:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi
Online

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: StringList oder dynamisches Array.

  Alt 9. Feb 2012, 07:41
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.
Einfügen : StringList besser
Löschen : Stringlist besser
Da eine Stringlist ein Array kapselt, ist das egal. Umkopiert wird in jedem Fall.
The angels have the phone box.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: StringList oder dynamisches Array.

  Alt 9. Feb 2012, 08:30
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:
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.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi
Online

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: StringList oder dynamisches Array.

  Alt 9. Feb 2012, 09:11
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.
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: StringList oder dynamisches Array.

  Alt 9. Feb 2012, 09:18
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi
Online

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: StringList oder dynamisches Array.

  Alt 9. Feb 2012, 10:32
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.
The angels have the phone box.
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#10

AW: StringList oder dynamisches Array.

  Alt 9. Feb 2012, 14:15
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.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:45 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