Einzelnen Beitrag anzeigen

Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#1

WhiteSpaceTrim: Schnellere Version, wie aber trimmen?

  Alt 12. Apr 2009, 13:12
Hallo, ich habe meine neuen Kenntnisse durch Euch bei nachfolgender Funktion ausprobiert,
die in einem String Leerräume entfernt, wenn diese mehr als 1x vorkommen:
Delphi-Quellcode:
program CleanWhiteSpace;

{$APPTYPE CONSOLE}

uses
  //FastMM4, FastMove,
  //Optimize,
  //RTLVclOptimize,
  SysUtils, // Für Profiler.inc notwendig
  Windows; // Für Profiler.inc notwendig
{$include Profiler.inc}
var xx,ii:Integer; // Nur für den Testlauf notwendig

// Original Version
// [EDIT] Code gelöscht. Veröffentlichung ist auf anderen Seiten nicht erlaubt.
function OldwhitespaceTrim(str : string) : string;
begin
// Leer
end;
//... Original Version ENDE

// Datum: 12.04.2009
// Löscht Leerräume, wenn diese mehr als 1x vorkommen.
//
// Neue Version
function WhiteSpaceTrim(const Str: string): String;
var
  i, Len,space: Integer;
  CurIn, CurOut: ^Char;
begin
  Len := Length(Str);
  SetLength(Result, Len);
  CurIn := Pointer(Str);
  CurOut := Pointer(Result);
  space:= 0;
  
  for i := 1 to Len do
  begin
  if space <> 1 then
      begin
      CurOut^ := CurIn^;
      Inc(CurOut);
      if(CurIn^ = ' ') then inc(space);
      end
      else
      if Curin^ <> ' then
         begin
         CurOut^ := CurIn^;
         Inc(CurOut);
         space := 0;
      end;
  inc(curin);
end;
  //SetLength(Result, Integer(CurOut) - Integer(Pointer(Result)));
  SetLength(Result, CurOut - PChar(Pointer(Result)));
end;
begin
Writeln;
// [EDIT] Code gelöscht...

Writeln('Teste... WhiteStringTrim -neu- ');
for xx := 1 to 10 do
   begin
   Start;
   for ii :=1 to 100000 do whitespaceTrim(' auf der Mauer ');
   Stopp;
   end;
Writeln('Ergebnis muss -auf der Mauer- sein:');
Writeln(whitespaceTrim('-'+' auf der Mauer '+'-'));Writeln;

Writeln('- ProgrammEnde mit [ENTER] -');Readln;
end.
Das Original mit fast 1000ms langsam, die neue Version benötigt nur ca. 40ms im vorliegendem Beispiel. Schön wäre noch eine Version, die die Leerräume links und rechts entfernt.
Dann noch ein LF zu beseitigen wäre wohl kein Problem.
Angehängte Dateien
Dateityp: 7z profiler_109.7z (374 Bytes, 0x aufgerufen)
  Mit Zitat antworten Zitat