Einzelnen Beitrag anzeigen

Stormy

Registriert seit: 8. Okt 2005
Ort: LPZ
73 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Kann man diese Funktion noch weiter optimieren?

  Alt 15. Jul 2009, 17:13
Hi,

auch schon mit dem Beispiel von Luckie versucht?

Delphi-Quellcode:
 // Wenn wir auf SysUtils verzichten wollen. ///////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
//
// StrPos
//
function StrPos(const Str1, Str2: PChar): PChar; assembler;
asm
        PUSH EDI
        PUSH ESI
        PUSH EBX
        OR EAX,EAX
        JE @@2
        OR EDX,EDX
        JE @@2
        MOV EBX,EAX
        MOV EDI,EDX
        XOR AL,AL
        MOV ECX,0FFFFFFFFH
        REPNE SCASB
        NOT ECX
        DEC ECX
        JE @@2
        MOV ESI,ECX
        MOV EDI,EBX
        MOV ECX,0FFFFFFFFH
        REPNE SCASB
        NOT ECX
        SUB ECX,ESI
        JBE @@2
        MOV EDI,EBX
        LEA EBX,[ESI-1]
@@1: MOV ESI,EDX
        LODSB
        REPNE SCASB
        JNE @@2
        MOV EAX,ECX
        PUSH EDI
        MOV ECX,EBX
        REPE CMPSB
        POP EDI
        MOV ECX,EAX
        JNE @@1
        LEA EAX,[EDI-1]
        JMP @@3
@@2: XOR EAX,EAX
@@3: POP EBX
        POP ESI
        POP EDI
end;

////////////////////////////////////////////////////////////////////////////////
//
// StrEnd
//
function StrEnd(const Str: PChar): PChar; assembler;
asm
        MOV EDX,EDI
        MOV EDI,EAX
        MOV ECX,0FFFFFFFFH
        XOR AL,AL
        REPNE SCASB
        LEA EAX,[EDI-1]
        MOV EDI,EDX
end;

////////////////////////////////////////////////////////////////////////////////
//
// Explode
// Splits a string with seperators into a string array
//
type
  TStringDynArray = array of string;

function Explode(const Separator, S: string; Limit: Integer = 0):
  TStringDynArray;
var
  SepLen : Integer;
  F, P : PChar;
  ALen, Index : Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then
    Exit;
  if Separator = 'then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := StrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then
      P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5); // mehrere auf einmal um schneller arbeiten zu können
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then
      Inc(P, SepLen);
  end;
  if Index < ALen then
    SetLength(Result, Index); // wirkliche Länge festlegen
end;

const
  MYSTRING = 'When,I,die,I,want,Hello,world,carved,on,my,headstone';

procedure TForm1.Button1Click(Sender: TObject);
var
  StringArray : TStringDynArray;
  Loop : Integer;
begin
  StringArray := Explode(',', MYSTRING);
  for Loop := 0 to length(StringArray) - 1 do
    ListBox1.Items.Add(StringArray[Loop]);
end;
  Mit Zitat antworten Zitat