Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.100 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Wie kann man diesen Code optimieren

  Alt 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....
  Mit Zitat antworten Zitat