Цитата:
Между прочим, моя 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,
Советую не реагировать так болезненно на чьи-то ошибки или недочеты - разжигаешь массовый срач. Если видишь у кого-то ошибку - не так сложно написать не в стиле "Гениально. Вот только вам опять в голову не пришло", а в стиле "Насколько я знаю, ..." Также не стоит так реагировать на нападки и гневные посты - их не так трудно проигнорировать.
У тебя ошибки в понимании тоже есть, об одной из них я писал. Но я ж не кричу по этому поводу в стиле тролля. Спокойнее надо быть.