Das müsste man noch mal wie untenstehend etwas beschleunigen können. Wie viel das schneller ist, hängt davon ab, ob der Text zu ersetzende Zeichen enthält und wenn ja, ab wann.
In der vorherigen Variante erfolgen IMMER Allokationen von Speicherbereich und zuweisende Speicheroperationen, auch wenn der Text gar keine zu ersetzende Zeichen enthält (eben durch das charweise kopieren).
Hier erfolgt das kopieren nur dann, wenn zu ersetzenden Zeichen vorhanden sind und nur ab der Stelle, wo das erste zu ersetzende Zeichen vorliegt. Liegt kein zu ersetzendes Zeichen vor, steigt die Funktion schon bei [1] aus und liefert den unveränderten String als Ergebnis zurück. Wenn man also viele Aufrufe dieser Funktion im Programmablauf hat und oft gar keine Ersetzungen vorgenommen werden müssen, dann sollte die Sache noch mal spürbar beschleunigt werden können.
Delphi-Quellcode:
function RemoveCharsEx(const S, Chars: string): string; // Chars CaseSensitive;
var
I, Index: integer;
Skip: array[Char] of boolean;
StartPos, LastPos: Integer;
begin
FillChar(Skip[#0], Length(Skip) * SizeOf(Skip[#0]), 0);
for I := 1 to Length(Chars) do
Skip[Chars[I]] := true;
Result := S; // Ergebnis vorbelegen
StartPos := -1;
for i := 1 to length (s) do // Prüfen, ob Text zu ersetzende Zeichen enthält
if skip[S[i]] then begin
StartPos := i;
LastPos := i;
break;
end;
if StartPos = -1 then exit; // [1] Text enthielt keine zu ersetzenden Zeichen
for I := StartPos to Length(S) do
if not Skip[S[I]] then
begin
Result[LastPos] := S[I];
Inc(LastPos);
end;
SetLength(Result, LastPos-1);
end;
Ich bin mir nicht sicher, ob das im Normalfall etwas bringt.
Bei
Result := S;
wird ein neuer String erzeugt und S in Result kopiert.
Bei
SetLength(Result, LastPos-1);
wird dann noch einmal ein neuer String erzeugt und wieder alles kopiert.
Wenn du dagegen am Anfang nur die Länge von Result festlegst wird ebenfalls ein neuer String erzeugt, aber es werden keine Inhalte kopiert.
Erst, wenn am Ende die Länge von Result festgelegt wird, werden Inhalte kopiert.
Bei längeren Texten wird das zweifache Kopieren von Strings m.E. eher negative Auswirkungen haben.
Lediglich dann, wenn nichts "removed" wird, also S unverändert zurückgegeben wird, bringt das Vorteile.