![]() |
Re: Was ist schneller? function oder 3x stringreplace?
Moin Helmi,
zu dem hier
Delphi-Quellcode:
fällt mir leider nur ein Wort ein: Sinnbefreit ;-)
SetLength(S_Text, length(Text));
S_Text := ''; 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:
Über die Reihenfolge musst Du Dir keine Gedanken machen, dass sortiert der Compiler schon so, dass die Case-Anweisung möglichst schnell durchlaufen wird.
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; Mit ein wenig mehr Aufwand könnte man das Ganze auch für Ersetzungen umbauen, die nicht 1:1 sind. |
Re: Was ist schneller? function oder 3x stringreplace?
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
Delphi-Quellcode:
das SetLength wieder aufhebt, war mir nicht bewusst. Ist aber gut zu wissen.
S := '';
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 |
Re: Was ist schneller? function oder 3x stringreplace?
Hallo,
wieder einmal muss ich auf meine Funktion ![]() Gruß xaromz |
Re: Was ist schneller? function oder 3x stringreplace?
Moin Helmi,
ich hätte da auch noch eine variable Lösung anzubieten:
Delphi-Quellcode:
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)
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 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