Показать сообщение отдельно
  #25  
Старый 27.03.2014, 22:38
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Между прочим, моя SubArrPos дважды взяла приз "лучшая функция для поиска по подмассиву байтов"
Сомневаюсь.
В коде
Код:
for I := 0 to LIterCnt do
    begin
      J := 0;
      while (J >= 0) and (J < L) do
      begin
        if PS[I + J] = PSubStr[J] then
          Inc(J)
        else
          J := -1;
      end;
      if J >= L then
        Exit(I + Offset - 1);
    end;
На каждый шаг внутреннего цикла выполняется 3 сравнения:
J >=0
J < L
PS[I + J] = PSubStr[J]
А в стандартном коде (модификацией которого является, к примеру, код seeman_tm)
Код:
for i := 0 to L - LS - 1 do
begin
   fl := true;
   for j := 0 to LS - 1 do
      if str[i + j] <> substr[j] then
      begin
        fl := false;
        break;
      end;
   if fl then
      Exit(...);
end;
на один цикл выполняется либо 2 сравнения:
str[i + j] <> substr[j]
for j := 0 to LS (с верхней границей)
Либо вовсе одно, если компилятор умный и додумается сравнивать в обратном порядке или завести два регистра - один для for с декрементом, а другой, собственно, j.
В любом случае, в критической части получаем как минимум на одно сравнение больше, остальная же идея кода полностью идентична: сравнивать, начиная с каждого байта, пока не встретим расхождение. А следовательно, код вероятнее всего медленнее.

to seeman_tm,
Советую не реагировать так болезненно на чьи-то ошибки или недочеты - разжигаешь массовый срач. Если видишь у кого-то ошибку - не так сложно написать не в стиле "Гениально. Вот только вам опять в голову не пришло", а в стиле "Насколько я знаю, ..." Также не стоит так реагировать на нападки и гневные посты - их не так трудно проигнорировать.
У тебя ошибки в понимании тоже есть, об одной из них я писал. Но я ж не кричу по этому поводу в стиле тролля. Спокойнее надо быть.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием