AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String dynamisch erstellen???

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

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#1

String dynamisch erstellen???

  Alt 2. Mär 2010, 19:43
Hallo!

In diesem Thread wurde ich auf die folgende Aussage von shmia aufmerksam:

Zitat von shmia:
Die SQL-Befehle sollte man nicht über eine Query-Komponente absenden, sondern falls möglich direkt über das Connection-Objekt oder Database-Objekt.
Beim Zusammenbauen der SQL-Befehle sollte man darauf achten, dass man nicht Folgendes tut:
SQL := SQL + ....; Hierbei würde jedes Mal der String verlängert, was zur Folge hat, dass ein neuer Speicherblock notwendig wird und dann der alte Block auf den neuen kopiert wird.
Gilt es für die Strings allgemein oder nur im Fall mit den SQL-Befehlen? Nehmen wir an, ich habe einen String, der je nach Situation dynamisch erweitert werden soll:

Delphi-Quellcode:
if Length(StringData) <> 'then
XMLData := XMLData + StringData
Wie wird es denn sonst gemacht?
  Mit Zitat antworten Zitat
s-off

Registriert seit: 20. Jan 2010
89 Beiträge
 
Delphi 2010 Professional
 
#2

Re: String dynamisch erstellen???

  Alt 2. Mär 2010, 20:36
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.
Gruß
s-off
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: String dynamisch erstellen???

  Alt 2. Mär 2010, 21:29
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
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#4

Re: String dynamisch erstellen???

  Alt 2. Mär 2010, 22:00
Zitat von jfheins:
Wenn du schon vorher weist, wie lang der String wird, kannst du das schon mit setlength festlegen
Und wenn ich es nicht mal ungefähr weiss, was dann? Wenn die o.b. Methode nicht ganz OK ist, dann muss es wohl eine richtige Methode geben.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#5

Re: String dynamisch erstellen???

  Alt 2. Mär 2010, 23:08
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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  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
 
#6

Re: String dynamisch erstellen???

  Alt 2. Mär 2010, 23:26
Zitat von Astat:
Hallo Romberg, str1 + str2 + str3 ist unter Delphi so schnell, dass Otto Normalverbraucher sich heute, darüber
wirklich keine Gedanken mehr machen braucht.
Wobei ich auch diese Meinung vertrete. Es ist zwar schon recht nett, wenn man in Benchmarks ganz vorne liegt, aber für wahrscheinlich 99% der Anwendungen spielt das absolut keinerlei Rolle, außer man will *die* schnellste JavaScript-Engine schreiben.

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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#7

Re: String dynamisch erstellen???

  Alt 3. Mär 2010, 01:06
Zitat von Astat:
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.
Was ist diese "normale Pointerarithmetic"? Ein Beispiel wäre sehr gut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: String dynamisch erstellen???

  Alt 3. Mär 2010, 07:36
Zitat von romber:
Was ist diese "normale Pointerarithmetic"? Ein Beispiel wäre sehr gut.
PChar/PAnsiChar/PWideChar

Wobei es ab Delphi 2009 sehr hilft, wenn man dieses schrecklich umgesetzte, wenn auch gut gemeinte, aber völlig schwachsinige StringChecking abschaltet.


Zitat von romber:
Und wenn ich es nicht mal ungefähr weiss, was dann?
Dann mußt du es eben Messen oder es lassen?

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.
$2B or not $2B
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: String dynamisch erstellen???

  Alt 3. Mär 2010, 07:59
Sei X dein String, der zu füllen ist.
Delphi-Quellcode:
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;
*)
Wesentlich besser sollte es, denke ich, nicht gehen. Vielleicht bringt das auch überhaupt nichts.
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...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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:46 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