Autor Beitrag
delphijanka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151

WinXP
D 2009 Arc., Java, C
BeitragVerfasst: So 30.05.10 09:39 
Hallo.

Ich bin an ein "Problem" gestossen und finde keine passende Info im Net.

Ich verwalte in einem zweidimensionalen Array Strings unterschiedlicher Länge, auch der Länge > 256. Da gibs auch die Funktion, um eine neue Zeile einzufügen.

Ich frage mich, soll ich am besten mit jedem Einfügen einer neuen Zeile die Zeilenanzahl einfach um 1 vergrößern (SetLength(Array, AltLength + 1)), oder besser ein Buffer verwenden, also immer eine "größere" Menge an Speicher anlegen, und dann einfach die Zeilen benutzen..?

Hier ergeben sich für mich zwei grundsätzliche Fragen:

1) Wann ist es schneller und zugleich Speicherplatzsparender,

a) ein einziges mal viel Speicherplatz zu reservieren und davon weniger zu benutzen oder
b) öfter reservieren, dabei aber nur soviel anlegen wie man braucht.

Vielleicht weiß der eine oder andere, wie der Faktor ist, um wieviel man den Speicherplatz bei Bedarf vergrößern muss, um im Durschnitt als beste Lösung zu sein.

2) Wie werden die Strings verwaltet?

Wenn ich also in meinem Feld für eine Zelle den Wert vergebe, wird da irgendwie der ganze Speicher, also das ganze Feld, neu aktualisisert? Oder verwaltet mein String-Array in Wirklichkeit nur Zeiger auf die Zeichenketten, die von Delphi automatisch verwaltet werden?

Zur Erinnrung: Datentyp ist "String".


Al Fazit stellt sich die Frage: lohnt sich überhaupt eine "Bufferizierung" mit 'String's in Delphi beim öfteren Anfügen neuer Zeilen?

Danke euch für eure Tipps.

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 30.05.10 09:57 
user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
Ich frage mich, soll ich am besten mit jedem Einfügen einer neuen Zeile die Zeilenanzahl einfach um 1
vergrößern (SetLength(Array, AltLength + 1)), oder besser ein Buffer verwenden, also immer eine
"größere" Menge an Speicher anlegen, und dann einfach die Zeilen benutzen..?
SetLength ist langsam und sollte möglichst selten aufgerufen werden. Deshalb ist es besser immer z.B. um 1000 zu vergrößern und am Ende auf die konkrete Länge zu verkleinern.

user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht weiß der eine oder andere, wie der Faktor ist, um wieviel man den Speicherplatz bei
Bedarf vergrößern muss, um im Durschnitt als beste Lösung zu sein.
Das kommt auf die Menge der Daten an. Es ist natürlich schlecht um 10.000 zu vergrößern, wenn nur immer um 50-100 Datensätze vergrößert wird. Genauso ist es schlecht immer um 100 zu vergrößern, wenn insgesamt immer ca. 1.000.000 Datensätze hinzugefügt werden.
Es sollte eben nicht übertrieben stark vergrößert werden, aber auch so wenig wie möglich. Tendentiell ist es aber besser mehr Speicherplatz als öfter SetLength zu verwenden.

user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
Oder verwaltet mein String-Array in Wirklichkeit nur Zeiger auf die
Zeichenketten, die von Delphi automatisch verwaltet werden?
Ja. Ein String ist ein Zeiger auf den Speicherbereich mit den Zeichen. Vor diesen Zeichen stehen zwei Integerwerte, in denen die Länge des Strings und der Referenzzähler der Nutzung des Strings stehen. Hinter den Zeichen steht noch ein Nullzeichen, so dass man leicht den String als PChar nutzen kann (mit dem Nullzeichen als Endzeichen).

user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
Al Fazit stellt sich die Frage: lohnt sich überhaupt eine "Bufferizierung" mit 'String's in Delphi beim
öfteren Anfügen neuer Zeilen?
Ja, durchaus, die konkrete Optimierung (Lesbarkeit versus Leistungsoptimierung) muss man im Einzelfall entscheiden. Denn eine TStringList ist natürlich bei weitem übersichtlicher und meistens schnell genug. Das kommt aber eben immer drauf an wie viele Daten verwaltet werden, wie der Zugriff darauf geschieht (sequentiell / wahlfrei) und ob normale Vorgehensweisen zu langsam sind.
delphijanka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151

WinXP
D 2009 Arc., Java, C
BeitragVerfasst: So 30.05.10 10:03 
Vielen Dank jaenicke.