AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Was ist schneller? function oder 3x stringreplace?
Thema durchsuchen
Ansicht
Themen-Optionen

Was ist schneller? function oder 3x stringreplace?

Ein Thema von Helmi · begonnen am 3. Jul 2005 · letzter Beitrag vom 24. Jan 2007
Antwort Antwort
Seite 3 von 3     123   
Christian Seehase
(Co-Admin)

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

Re: Was ist schneller? function oder 3x stringreplace?

  Alt 24. Jan 2007, 22:19
Moin Helmi,

zu dem hier

Delphi-Quellcode:
  SetLength(S_Text, length(Text));
  S_Text := '';
fällt mir leider nur ein Wort ein: Sinnbefreit
Ist nicht böse gemeint, denn schliesslich kann man nicht alles wissen.

Durch das SetLength sorgst Du dafür, dass S_Text soviele Zeichen aufnehmen kann, wie Text lang ist, und mit S_Text := '' bringst Du die Länge wieder auf 0.
So wie Du es geschrieben hast (immer das jeweilige Zeichen zum Ergebnisstring addieren) könntest Du SetLength also weglassen...
ABER:
Da Quell- und Zielstring auch nach dem Ersetzen der Zeichen gleich lang sind, solltest Du besser auf das S_Text := '' verzichten, und die Ersetzung anders lösen (auch wenn Deine Lösung wohl schon merklich schneller sein dürfte als die Variante mit StringReplace), Du kannst nämlich einfach die Zeichen, die unverändert bleiben sollen direkt an den Index im Zielstring schreiben, aus dem Du sie aus dem Quellstring gelesen hast.
Ausserdem ist es ungünstig jedesmal in einer Schleife den gesamten String der zu ersetzenden Zeichen durchzugehen, vermutlich wäre hier sogar die Verwendung von Pos schneller. Ich würde es allerdings mit Case lösen:

Delphi-Quellcode:
var
  i: Integer;
  S_Text: String;

begin
  SetLength(S_Text, length(Text));
  for i := 1 to length(Text) do begin
    case Text[i] of
      'ä' : S_Text[i] := chr($84);
      'ö' : S_Text[i] := chr($94);
      //... usw. bis 'µ', dann
      else S_Text[i] := Text[i];
    end;
  end;
  Serial.TransmittText(S_Text);
end;
Über die Reihenfolge musst Du Dir keine Gedanken machen, dass sortiert der Compiler schon so, dass die Case-Anweisung möglichst schnell durchlaufen wird.

Mit ein wenig mehr Aufwand könnte man das Ganze auch für Ersetzungen umbauen, die nicht 1:1 sind.
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 Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#22

Re: Was ist schneller? function oder 3x stringreplace?

  Alt 24. Jan 2007, 22:31
Hallo Christian,

danke für deine Hinweise.

Ich hab eigentlich bisher kaum mit Setlength bei Strings gearbeitet.

Die erste Version von dem Code war ohne SetLength.
Erst zum Schluss dacht ich mir, da ich schon öfters hier gelesen habe, dass es was bringe, wenn man den "Ausgabe_String" mit SetLength auf die Länge des "Eingabe_Strings" bringt.
Dass dann das
S := ''; das SetLength wieder aufhebt, war mir nicht bewusst. Ist aber gut zu wissen.

eine alte Version mit einer case-Abfrage, hatte ich auch mal (die schwirrt auch hier in der DP rum).
Da ich aber mal die Länge der Array varierbar machen möchte, wär eine Case-Abfrage nicht möglich.

Ich würd schon gern bei dem oberen Code bleiben.

Was mir natürlich auch nicht gefällt, dass bei dem oberen Code bei jedem Char die j-Schleife (for-Schleife) durchlaufen werden muss.

Ich hab ja momentan einen Parallel-Thread hier in der DP laufen, in dem die Frage gestellt wurde, ob es nicht möglich ist, ohne Schleife einen Eintrag in einem Array zu erhalten (als Index).

Pos hab ich versucht, aber ich habs bisher noch nicht mit Arrays gemacht und bin deshalb daran gescheitert
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#23

Re: Was ist schneller? function oder 3x stringreplace?

  Alt 24. Jan 2007, 22:43
Hallo,

wieder einmal muss ich auf meine Funktion StringReplaceMultiple verweisen. Die ist genau für solche Fälle gedacht. Ich weiß zwar nicht, wie die Performance im Vergleich zu Deiner zweiten Funktion ist, aber grundsätzlich ist das schon ziemlich schnell.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: Was ist schneller? function oder 3x stringreplace?

  Alt 24. Jan 2007, 23:04
Moin Helmi,

ich hätte da auch noch eine variable Lösung anzubieten:

Delphi-Quellcode:
var
  sTranslation : string;
  sSource : string;
  sDest : string;
  i : Integer;

begin
  SetLength(sDest,Length(sSource));
  for i := 1 to Length(sSource) do begin
    sDest[i] := sTranslation[Ord(sSource[i])+1];
  end;
end;
sTranslation müsste nur entsprechend gefüllt sein, und natürlich alle 256 Zeichen enthalten, wobei an dem Index der zu übersetzenden Zeichen, jeweils der Code des neuen gespeichert ist, und an allen anderen der korrespondierende (z.B. an Index 66 steht 65, +1, da der erste Index im String ja 1 und nicht 0 ist)
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
Antwort Antwort
Seite 3 von 3     123   


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 21:21 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