Registriert seit: 8. Okt 2005
Ort: LPZ
73 Beiträge
Delphi 6 Enterprise
|
Re: Kann man diese Funktion noch weiter optimieren?
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;
|