![]() |
String dynamisch erstellen???
Hallo!
In ![]() Zitat:
Delphi-Quellcode:
Wie wird es denn sonst gemacht?
if Length(StringData) <> '' then
XMLData := XMLData + StringData |
Re: String dynamisch erstellen???
Welche Delphi-Version nutzt Du denn?
Ab 2009 gibt es die neue StringBuilder-Klasse, die zwar langsamer sein soll (habe ich irgendwo mal gelesen; ich glaube bei Marco Cantu), aber dafür nicht das Verhalten der regulären Stringkonkatenation geht. Ich kenne diese Klasse nur aus C# - ob sie für Delphi genauso funktioniert, weiß ich nicht. |
Re: String dynamisch erstellen???
Wenn du schon vorher weist, wie lang der String wird, kannst du das schon mit setlength festlegen - der string wird dann erst umkopiert wenn der Platz nicht mehr reicht
|
Re: String dynamisch erstellen???
Zitat:
|
Re: String dynamisch erstellen???
Hallo Romberg, str1 + str2 + str3 ist unter Delphi so schnell, dass Otto Normalverbraucher sich heute, darüber
wirklich keine Gedanken mehr machen braucht. Unter .Net, Java ist Str1 + Str2 usw. tödlich, da hier jeweils Objekte verknüpft werden, dies hat dazu geführt, dass manche glauben , dies sei in Delphi auch so. Für Benchmarks, ist es wichtig den String vorher eine definierte (großzügige) Länge zu geben, und dann mit normaler Pointerarithmetic, diesen "Buffer" zu füllen. Ist dann wirklich min um Faktor 5X schneller. lg. Astat |
Re: String dynamisch erstellen???
Zitat:
Abgesehen davon sollte man aber über die Problematik von String-Konkatenation wissen. Kleiner Hinweis aus der Hilfe: Dort wird gerate den "+"-Operator anstatt der Funktion conact() zu verwenden. Dort steht, dass + eben schneller ist :zwinker: |
Re: String dynamisch erstellen???
Zitat:
|
Re: String dynamisch erstellen???
Zitat:
Wobei es ab Delphi 2009 sehr hilft, wenn man dieses schrecklich umgesetzte, wenn auch gut gemeinte, aber völlig schwachsinige StringChecking abschaltet. Zitat:
Es kommt dann darauf an, was schneller ist: - zwei Durchläufe > messen/zählen, Stringlänge setzen und dann kopieren - oder eben etwas unoptimaler die Strings einzeln concatieren. |
Re: String dynamisch erstellen???
Sei X dein String, der zu füllen ist.
Delphi-Quellcode:
Wesentlich besser sollte es, denke ich, nicht gehen. Vielleicht bringt das auch überhaupt nichts. :gruebel:
Var
CurrentCharCountInX : Integer; Procedure InitializeX; Begin SetLength (X, 1024); CurrentCharCountInX := 0 End; Procedure EnsureProperLengthOfX (LengthOfStringToAdd : Integer); Begin If CurrentCharCountInX + LengthOfStringToAdd > Length (X) Then SetLength (X, 2 * Length(X)); End; Procedure AppendStringToX (Const aString : String); Var LengthOfString : Integer; Begin LengthOfString := Length(aString); EnsureProperLengthOfX (LengthOfString); Move (aString[1], X[CurrentCharCountInX + 1], LengthOfString); Inc (CurrentCharCountInX , LengthOfString); End; Procedure FinalizeX; Begin SetLength (X, CurrentCharCountInX); End; // TODO: Gib X einen besseren Namen (* Aufruf: InitializeX; AppendStringToX (Str1); ... AppendStringToX (StrN); FinalizeX; *) Natürlich kann/sollte man die generische Move-Routine durch einen Gewinner der FastCode-Challenge ersetzen. Auch ein 'Inline' sollte noch etwas bringen. Aber im Wesen dürfte das nahe am Optimum sein. Aber wie Astat schon treffend anmerkte, braucht das im normalen Leben kein Schwein. Vor allen Dingen nicht, wenn der String anschließend als SQL-Befehl an einen SQL-Server geschickt wird. Ich vermute in diesem Fall den Performancebottleneck nämlich nicht beim Konkatenieren... :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr. |
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