Zitat von
p80286:
scheint mir "doppeltgemoppelt" und daher eigentlich ein Performance Killer.
Der Performance Killer ist die Indizierung durch den Array-Index.
Wenn da z.B. steht: s[i] , dann wird intern der Zeiger s genommen, dann wird i dazuaddiert, dies ergibt dann den Zeiger auf das zu lesende oder schreibende Zeichen.
Bei einem 4MB-String wären das 8 Millionen unnötige Additionen.
Hier die komplett getunte Funktion:
Delphi-Quellcode:
function StrReplaceChar(const S: Ansistring; const Source, Replace: AnsiChar): AnsiString;
var
I: Integer;
p : PAnsiChar;
begin
Result := S;
UniqueString(Result);
p := PAnsiChar(Result);
for I := Length(S)-1 downto 0 do
begin
if p^ = Source then
p^ := Replace;
Inc(p);
end;
end;
Hier wird der Zeiger p einmal gesetzt und dann immer nur mit Inc() weiterbewegt.
Inc(p) wird direkt in einen einzigen (schnellen) X86-Befehl übersetzt.
Da die Schleifenvariable nicht mehr benützt wird, kann man die Schleife auch rückwärts laufen lassen.
Schleifen, die rückwärts runter auf 0 zählen sind besonders gut in Maschinencode zu übersetzen und daher sehr schnell.