Показать сообщение отдельно

  #4422  
Старый 20.09.2009, 21:23
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


По умолчанию

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 микросекунд при загруженности проца) а сколько делает это твой код - я хз. потому что надоело ждать.

Вывод такой - если нужно чтото искать, вырезать и копировать, то лучше работать с памятью напрямую чем через строки.
 
Ответить с цитированием