2 Nullsleep твой код конечно очень наглядный, но увы очень медленный ((
Работа со строками в делфи - это очень медленная вешь. Вот банальный пример.
Твоя функция(PosCount) - основанная на работе со строка и
моя(mPosCount) основанная на работе с память. ПРи больших размерах строки скорость реально заметна.
Код:
function PosCount(const Substr, Str: string): Integer;
var
i, p: Integer;
s: string;
begin
s := Str;
Result := 0;
for i := 1 to Length(s) do
begin
p := Pos(Substr, s);
if p <> 0 then Inc(Result);
Delete(s, 1, p);
end;
end;
function mPosCount(const Substr, Str: string): Integer;
var
s: pchar;
len: integer;
sublen: integer;
begin
s := @str[1];
sublen := length(substr);
len := length(str) - sublen + 1;
result := 0;
while len > 0 do
begin
if CompareMem(s, @substr[1], sublen) then
begin
inc(result);
len := len - sublen;
s := s + sublen;
end
else
begin
dec(len);
inc(s);
end;
end;
end;
И вот тестирование работы:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
x:integer;
s1,s2:string;
start, stop:dword;
cnt:integer;
begin
s1 := 'dfgdfklgjkfdg8fdg8f0dg09g0f9d0g';
s2 := '';
for x:=1 to 20000 do s2:=s2+s1;
start := GetTickCount;
cnt := mPosCount(s1, s2);
stop := GetTickCount;
memo1.Lines.Add(inttostr(stop - start));
memo1.Lines.Add('CNT: '+inttostr(cnt));
start := GetTickCount;
cnt := PosCount(s1, s2);
stop := GetTickCount;
memo1.Lines.Add(inttostr(stop - start));
memo1.Lines.Add('CNT: '+inttostr(cnt));
end;
Результаты видны сразу
0
CNT: 20000
1578
CNT: 20000
т.е. мой код данные действия сделал меньше чем за 1 микросекунду.
А твой код делал 1578 микросекунд что примерно равно 1,5 секунды
При кол-во повторов 100k мой код выполнил данные действия также меньше микросекунды (иногда 16 микросекунд при загруженности проца) а сколько делает это твой код - я хз. потому что надоело ждать.
Вывод такой - если нужно чтото искать, вырезать и копировать, то лучше работать с памятью напрямую чем через строки.