|
| Optimering af streng-rutine Fra : Thomas Holmgren |
Dato : 31-10-05 20:36 |
|
Hej alle!
Jeg har en funktion som tager en kommasepareret streng som input og
returnerer et array med hvert element. Dvs.
strengen 'a;b;c' bliver til
arr[0] = 'a'
arr[1] = 'b'
arr[2] = 'c'
Jeg har lavet funktionen som vist herunder. Problemet er at den kører
lidt langsomt efter min smag.. Med 20.000 elementer i input-strengen kan
den finde på at køre flere min. Jeg har lavet den så effektivt som jeg
kunne (udfra et eks. på nettet), men vil gerne høre om nogen har gode
ideer? Det må ku' gøres bedre! :)
Herunder følger funktion:
TStringArray er et array af strenge,
input er en semikolon-delimited streng,
count er antallet af semikolonner i inputstrengen.
function StringSplit(input : string; count : integer) : TStringArray;
var
i, n : integer;
p, q, s : PChar;
begin
SetLength(Result, count + 1);
p := PChar(input);
s := PChar(';');
n := 1;
i := 0;
repeat
q := AnsiStrPos(p, s);
if q = nil then
q := AnsiStrScan(p, #0);
SetString(Result[i], p, q - p);
p := q + n;
inc(i);
until q^ = #0;
end;
| |
Thomas Holmgren (31-10-2005)
| Kommentar Fra : Thomas Holmgren |
Dato : 31-10-05 21:20 |
|
Hej igen
Jeg prøvede lige at sammenligne min string-split-metode med metoden
indbygget i TStringList. Den kører godt nok stærkt. Bruger jeg følgende
i min funktion:
Strings.Delimiter := ';';
Strings.DelimitedText := Input;
for i := 0 to Strings.Count - 1 do
begin
Result[i] := Strings.Strings[i];
end;
...går det lige knap 150 gange så hurtigt på min test-streng med 20.000
elementer. :)
thm
Thomas Holmgren wrote:
> Hej alle!
>
> Jeg har en funktion som tager en kommasepareret streng som input og
> returnerer et array med hvert element. Dvs.
>
> strengen 'a;b;c' bliver til
>
> arr[0] = 'a'
> arr[1] = 'b'
> arr[2] = 'c'
>
> Jeg har lavet funktionen som vist herunder. Problemet er at den kører
> lidt langsomt efter min smag.. Med 20.000 elementer i input-strengen kan
> den finde på at køre flere min. Jeg har lavet den så effektivt som jeg
> kunne (udfra et eks. på nettet), men vil gerne høre om nogen har gode
> ideer? Det må ku' gøres bedre! :)
>
> Herunder følger funktion:
>
> TStringArray er et array af strenge,
> input er en semikolon-delimited streng,
> count er antallet af semikolonner i inputstrengen.
>
>
> function StringSplit(input : string; count : integer) : TStringArray;
> var
> i, n : integer;
> p, q, s : PChar;
>
> begin
> SetLength(Result, count + 1);
> p := PChar(input);
> s := PChar(';');
> n := 1;
> i := 0;
>
> repeat
> q := AnsiStrPos(p, s);
> if q = nil then
> q := AnsiStrScan(p, #0);
> SetString(Result[i], p, q - p);
> p := q + n;
> inc(i);
> until q^ = #0;
> end;
| |
Finn Bindeballe (31-10-2005)
| Kommentar Fra : Finn Bindeballe |
Dato : 31-10-05 23:09 |
|
hej....
Hvis jeg var dig, ville jeg bruge en TStringlist.... den kan.... og er
hurtig....
/F
| |
|
|