![]() |
Re: StringReplace und doppelte Zeichen
Wurde korrigiert... Habs mit den Argumenten etwas verwirrt.
|
Re: StringReplace und doppelte Zeichen
Fehlermeldung:
Delphi-Quellcode:
if i > 0 then begin
Move(s[1], result[1], i); pe := @s[i+1] + Length(s) - i; << E2015 Operator ist auf diesen Operantentyp nicht anwendbar |
Re: StringReplace und doppelte Zeichen
*lach* Wieso funktioniert es nur bei himi? Wenn ich nur Delphi hätte, das ganze auch zu testen ;)
Delphi-Quellcode:
Wenn das jetzt nicht läuft, geb ichs aber auf.
function ReduceMultiples(const s: string; c: char): string;
var pe, pr, pc: PChar; i: integer; begin if s = '' then exit; SetLength(result, Length(s)); pc := @s[1]; i := 0; while pc^ <> c do begin Inc(pc); Inc(i); end; if i > 0 then begin Move(s[1], result[1], i); pe := PChar(Integer(@s[i+1]) + Length(s) - i); pr := @result[i+1]; end else begin pe := PChar(Integer(@s[1]) + Length(s)); pr := @result[1]; end; while pc <> pe do begin while (pr^ = pc^) and (pc^ = c) do Inc(pc); pr^ := pc^; Inc(pr); Inc(pc); end; SetLength(result, Integer(pr) - Integer(@result[1])); end; |
Re: StringReplace und doppelte Zeichen
fast :-)
Code:
Variante Opa: 35 Ticks (0.0097778 ms) mit dem Ergebnis: Erfolgreich
Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 11 Ticks (0.0030730 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xxxxCCCxxx mit Zeichen Variante alzaimar: 10 Ticks (0.0027937 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante Grenzgaenger: 11 Ticks (0.0030730 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante himitsu: 10 Ticks (0.0027937 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen |
Re: StringReplace und doppelte Zeichen
Zitat:
Da hier mal wieder Pointerarithmetik schneller zu sein scheint als Indizierung eines Strings (beim FastPos-Projekt ist es grad anders herum) habe ich meine Variante mal mit Pointern implementiert. Das wird -bei mir- doppelt so schnell. Kann eigentlich nicht sein, aber es scheint zu funktionieren... Ich erzeuge einen String der Länge 10000 mit zufälligen Zeichen aus ABCD und kürze 'A' weg.
Delphi-Quellcode:
Function RemoveCharRepetitionsP(Const aText: String; aChar: Char): String;
Var ip, jp, ep: PChar; c: Char; Begin setLength(Result, Length(aText)); If Length(aText) = 0 Then Exit; ip := @aText[1]; jp := @Result[1]; c := ip^; ep := ip+Length (aText); Result[1] := c; inc(ip); while ip<ep do begin If (c <> aChar) Or (ip^ <> c) Then Begin Inc(jp); c := ip^; jp^:=c; End; inc (ip); End; SetLength(Result, jp-@Result[1]+1); End; |
Re: StringReplace und doppelte Zeichen
Das ist hier bei den Testdaten gleich schnell...
Code:
aber stimmt schon, hängt ebenfalls von den testdaten (länge, aufbau und menge) ab.
Variante Opa: 34 Ticks (0.0094984 ms) mit dem Ergebnis: Erfolgreich
Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 12 Ticks (0.0033524 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xxxxCCCxxx mit Zeichen Variante alzaimar: 9 Ticks (0.0025143 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante Grenzgaenger: 12 Ticks (0.0033524 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante himitsu: 10 Ticks (0.0027937 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Denke, jetzt sollten wir Weihnachten feiern, Opa ist auch glücklich da seine routine um das 380% schneller geworden ist, und das ganze ohne 'ne zeile Assembler :-) Wünsche noch frohe Weihnachten :-) |
Re: StringReplace und doppelte Zeichen
Hi Grenzgaenger. Hast Recht, Kinder sind inner Falle und nu is Ruhe im Stall.
Teste mal mit längeren Strings, da sollte der Performancegewinn schon mehr auffallen. |
Re: StringReplace und doppelte Zeichen
Ist auch nicht so. Dein Code mit dem Array ist schneller als der mit den Pointern
Code:
Variante Opa: 35 Ticks (0.0097778 ms) mit dem Ergebnis: Erfolgreich
Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 12 Ticks (0.0033524 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xxxxCCCxxx mit Zeichen Variante alzaimar Pointer: 10 Ticks (0.0027937 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante Grenzgaenger: 12 Ticks (0.0033524 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante himitsu: 11 Ticks (0.0030730 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante alzaimar Induziertes Array: 9 Ticks (0.0025143 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen |
Re: StringReplace und doppelte Zeichen
Hallo,
wenn man nicht gerade nach dem Zeichen #0 suchen möchte, dann dürfte auch folgende Routine funktionieren:
Delphi-Quellcode:
Frohe Weihnachten!
function ReduceMultipleChars (const s: string; c: Char = ' '): string;
var pRead, pEnd, pWrite : PChar; begin pRead := PChar(s); pEnd := pRead + Length(s); SetLength (Result, Length(s)); pWrite := PChar(Result); while (pRead <> pEnd) do begin repeat pWrite^ := pRead^; Inc (pRead); Inc (pWrite); until ((pRead[-1] = c) or (pRead = pEnd)); while (pRead^ = c) do Inc (pRead); end; SetLength (Result, pWrite - PChar(Result)); end; |
Re: StringReplace und doppelte Zeichen
Respekt :-)
Delphi-Quellcode:
langsam darf ich da den Testrahmen noch ausbauen... um die Unterschiede herauszuextrahieren... :-)
Variante Opa: 34 Ticks (0.0094984 ms) mit dem Ergebnis: Erfolgreich
Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 12 Ticks (0.0033524 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xxxxCCCxxx mit Zeichen Variante alzaimar Pointer: 9 Ticks (0.0025143 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante Grenzgaenger: 11 Ticks (0.0030730 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante himitsu: 10 Ticks (0.0027937 ms) mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante alzaimar Induziertes Array: 9 Ticks (0.0025143 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante Hawkeye219: 9 Ticks (0.0025143 ms) mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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