Registriert seit: 17. Nov 2005
Ort: Hamburg
1.100 Beiträge
Delphi XE2 Professional
|
AW: Wie kann man diesen Code optimieren
10. Apr 2025, 18:40
Ungetestet: Vieleicht so, oder ähnlich um in einem Durchlauf alle Zeichen zu entfernen?
Delphi-Quellcode:
uses
System.SysUtils, System.Classes;
const
Removals : set of Char = [' ', '-', Chr(151), '_', ':', ';', ',', '.', '!', ''''];
function CleanUpTextUsingBuilder(const S: string): string;
var
i : Integer;
sb : TStringBuilder;
begin
sb := TStringBuilder.Create(Length(S));
try
for i := 1 to Length(S) do
begin
if not (S[i] in Removals) then
sb.Append(S[i]);
end;
Result := sb.ToString;
finally
sb.Free;
end;
end;
Das geht aber deutlich (Faktor 8) schneller:
Delphi-Quellcode:
FUNCTION RemoveChars(const S:String):String;
var Len:Integer; P:PChar;
begin
SetLength(Result,Length(S));
P:=PChar(S);
Len:=0;
while P^<>#0 do begin
if not (P^ in Removals) then begin
Inc(Len);
Result[Len]:=P^;
end;
Inc(P);
end;
SetLength(Result,Len);
end;
Testprozedur:
Delphi-Quellcode:
PROCEDURE TMain.Test;
const
Removals : set of Char = [' ', ' -', Chr(151), ' _', ' :', ' ;', ' ,', ' .', ' !', ' '' '];
Text=' Mit Delphi kann man tolle Sacchen machen, zum Beispiel '+
' Sonderzeichen wie '' _'' , '' :'' , '' ;'' , '' .'' , '' !'' entfernen';
function CleanUpTextUsingBuilder( const S: string): string;
var
i : Integer;
sb : TStringBuilder;
begin
sb := TStringBuilder.Create(Length(S));
try
for i := 1 to Length(S) do
begin
if not (S[i] in Removals) then
sb.Append(S[i]);
end;
Result := sb.ToString;
finally
sb.Free;
end;
end;
FUNCTION RemoveChars( const S: String): String;
var Len:Integer; P:PChar;
begin
SetLength(Result,Length(S));
P:=PChar(S);
Len:=0;
while P^<>#0 do begin
if not (P^ in Removals) then begin
Inc(Len);
Result[Len]:=P^;
end;
Inc(P);
end;
SetLength(Result,Len);
end;
FUNCTION TimeStamp:Int64;
asm
rdtsc
end;
var T1,T2,T3:Int64; S1,S2: String;
begin
T1:=TimeStamp;
S1:=CleanUpTextUsingBuilder(Text);
T2:=TimeStamp;
S2:=RemoveChars(Text);
T3:=TimeStamp;
ShowMessage(S1+#13+S2+#13+IntToStr(T2-T1)+#13+IntToStr(T3-T2));
end;
Message
MitDelphikannmantolleSacchenmachenzumBeispielSonde rzeichenwieentfernen
MitDelphikannmantolleSacchenmachenzumBeispielSonde rzeichenwieentfernen
67064
8032
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
|