AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Frage zum Aneinanderhängen von Strings
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zum Aneinanderhängen von Strings

Ein Thema von Neutral General · begonnen am 2. Mär 2010 · letzter Beitrag vom 3. Mär 2010
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Frage zum Aneinanderhängen von Strings

  Alt 2. Mär 2010, 22:33
Hallo,

Die Stringkonkatenation ist ja denke ich mal nicht gerade das schnellste. Vor allem wenn ich einen ganzen Text z.B. Char für Char aneinanderhänge muss jedesmal Speicher für 1 weiteren Char angefordert werden...

Wenn ich jetzt die Länge eines Strings mit SetLength auf sagen wir 200 stelle und somit auch schon mal dementsprechend viel Speicherplatz auf einen Rutsch anfordere und dann wieder schreibe S := S + 'A'; (z.B.).. Wird dann wieder Speicher angefordert oder geht das dann performanter weil noch genug verfügbar ist?


Also konkret:

Delphi-Quellcode:
var Str1, Str2: String;
begin
  // Str1
  Str1 := '';
  for i:= 1 to 100000 do
    Str1 := Str1 + 'A';
 
  // Str2
  SetLength(Str2,100000);
  FillChar(Str2[1],100000,0);
  for i:= 1 to 100000 do
    Str2 := Str2 + 'A';
Welche der beiden Schleifen ist schneller?

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Frage zum Aneinanderhängen von Strings

  Alt 2. Mär 2010, 22:57
Die Schleifen dürften gleichschnell sein, denn bei der zweiten wird auch immer Zeichen für Zeichen angefügt, nur dass der zweite String anschliessend 200000 Zeichen lang ist.
Schneller geht es, wenn Du die Zeichen in den jeweiligen Index schreibst:

Delphi-Quellcode:
  SetLength(Str2,100000);
  for i:= 1 to 100000 do
    Str2[i] := 'A';
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Frage zum Aneinanderhängen von Strings

  Alt 2. Mär 2010, 23:06
Oh.. richtig.. jetzt wo du's sagst

Jo danke Ich denke dann hätte sich das auch erledigt
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

Re: Frage zum Aneinanderhängen von Strings

  Alt 2. Mär 2010, 23:44
Vielleicht wäre es an der Stelle auch noch interessant zu wissen, was denn in einem String steht, wenn ich SetLength auf ihn anwende, also sowas hier
Delphi-Quellcode:
var
  str : String;
begin
  SetLength(set, 100);
  // <- was hat str nun für einen Wert?
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

Re: Frage zum Aneinanderhängen von Strings

  Alt 3. Mär 2010, 07:40
Da SetLength den Speicher nicht initialisiert, sind alle neuen Zeichen undefiniert.

Wurde zufällig ein ein neuer/leerer Speicherbereich verwendet, dann stehen #0-en drin, ansonsten halt irgendwelche zufällig dort im Speicher rumliegende Byte-/Zeichenfolgen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Frage zum Aneinanderhängen von Strings

  Alt 3. Mär 2010, 07:43
Ausprobieren? F1 drücken?

Und folgende Stringkonkatenation ist noch schneller:
C := Str1 + Str2;
Das ist ca. 10x schneller als die Variante, die erst per SetLength den gesammten Speicher reserviert, welche widerum 10x schneller als die Variante ist, die den String Zeichen für Zeichen zusammenbappt.

Ich habe das übrigens einfach ausprobiert, das hat mich 5 min gekostet und die Frage war beantwortet.

Zitat von himitsu:
Da SetLength den Speicher nicht initialisiert, sind alle neuen Zeichen undefiniert.
Korrekt, gilt aber nur für Strings, nicht für Arrays o.ä. Aber hier geht es ja (nur) um Strings und von daher ... blafasel blub.
Das hätte man übrigens auch durch Verwendung des magischen EffEins ermitteln können.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: Frage zum Aneinanderhängen von Strings

  Alt 3. Mär 2010, 08:12
Zitat von Neutral General:
Also konkret:

Delphi-Quellcode:
var Str1, Str2: String;
begin
  // Str1
  Str1 := '';
  for i:= 1 to 100000 do
    Str1 := Str1 + 'A';
 
  // Str2
  SetLength(Str2,100000);
  FillChar(Str2[1],100000,0);
  for i:= 1 to 100000 do
    Str2 := Str2 + 'A';
Du meintest wohl
Delphi-Quellcode:
// Str2
SetLength(Str2, 100000);
//FillChar(Str2[1], 100000 * SizeOf(Char), 0);
for i := 1 to 100000 do
  Str2[i] := 'A';
Denn sonst ist die 2 noch langsamer, da sie schon mit einem größerem Ausgangsstring genau das Selbe (in Bezug auf die Schleife) macht.

Delphi-Quellcode:
Var P: PChar;

// Str2
SetLength(Str2, 100000);
P := @Str[1];
for i := 99999 downto 0 do
  P[i] := 'A';
Dank 'ner guten Codeoptimierung seitens des Delphicompilers ist dieses mit das Schnellste.

Schneller ist da nur noch dieses (vorallem seit D2006?, wo das FastCodeProjekt in Delphi integriert wurde)
Delphi-Quellcode:
// Str2 = AnsiString
SetLength(Str2, 100000);
FillChar(@Str2[1], 100000, 'A');
oder gleich Delphi-Referenz durchsuchenStringOfChar
Str2 := StringOfChar('A', 100000);
Dieses
Delphi-Quellcode:
Str1 := '';
for i:= 1 to 100000 do
  Str1 := Str1 + 'A';
enspricht ja
Code:
Str1 leeren (falls noch nicht leer)
Schleife mit 100.000 Durchgängen
  neuen String mit Länge ( Length(Str1) + Length('A') ) reservieren
  beide Strings in den neuen String reinkopieren
  alten String Str1 freigeben
  Variable Str1 durch neuen String ersetzen.
Ende der Schleife
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: Frage zum Aneinanderhängen von Strings

  Alt 3. Mär 2010, 09:45
Hallo,

Vielleicht hätte ich erwähnen sollen, dass es um das Scannen von Quellcode geht. Und da muss ich eben nunmal Zeichen für Zeichen durch den String geben und wenn ich auf einen String treffe muss ich dann auch immer Zeichen für Zeichen schauen ob das nächste Zeichen noch zu dem String gehört und ggf. zum Token hinzufügen.

Von daher nutzt mir

FillChar(Str,10000,'A'); o.ä. nichts
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

Re: Frage zum Aneinanderhängen von Strings

  Alt 3. Mär 2010, 09:51
Besser als
S := S + irgendwas; ist dann halt
Delphi-Quellcode:
//Insert(irgendwas, S, Length(S) + 1);
Insert(irgendwas, S, MaxInt);
Denn wenn Insert, bzw. der Speichermanager den internen Speicher hier "inplace", also ohne verschieben/umkopieren vergrößern kann, dann wird nur noch der anzuhängende String da reinkopiert und fertig.

Zitat:
S := S1 + S2;
Ich hab allerdings nicht nachgeschaut, ob Concat2 (_LStrCat, bzw. _UStrCat) vielleicht prüft, ob S1 und S das Selbe sind und hier auch schon in dieser Art optimiert optimiert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#10

Re: Frage zum Aneinanderhängen von Strings

  Alt 3. Mär 2010, 16:57
Zitat von Neutral General:
Vielleicht hätte ich erwähnen sollen, dass es um das Scannen von Quellcode geht. Und da muss ich eben nunmal Zeichen für Zeichen durch den String geben und wenn ich auf einen String treffe muss ich dann auch immer Zeichen für Zeichen schauen ob das nächste Zeichen noch zu dem String gehört und ggf. zum Token hinzufügen.
Äh, wozu dann überhaupt Strings erzeugen ? Bau dir ein TSubstring, also einen Record (Parent, Start, Length), der einfach ein Intervall in einem Parent-String referenziert. Schon bist du allokationsfrei .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:39 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