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

Думаю, у MAD-а имелся в виду флаг.
Конечно, формально решение с goto немножко быстрее, чем с флагом, но выглядит оно откровенно ужасно. Если нужна понятность - то лучше юзать стандартное с флагом. Если нужна скорость - читаем матчасть (привел только один из примеров) и чуток расширяем для обработки блоков памяти, чем строка вообще-то всегда и является. А так - и скорости нет, и вид ужасен.
Если искомые блоки памяти короткие, вероятно будет выгоднее без крутых алгоритмов - но в этом случае тот же C++-компилятор пишет запутанный код memcmp для сравнения конкретного блока (вместо внутреннего цикла), который сравнивает по DWORD-ам, а не по байтам, что действительно даст прирост к скорости (как работает CompareMem для делфи не смотрел, скорее всего так же). Хотя табличка для того же БМХ строится очень быстро и даст прирост скорости в т.ч. на коротких блоках. Собственно как-то так строится:
Код:
FillMemory(table, length(needle) - 1, 1024)
for i := 0 to length(needle) - 1 do
  table[needle[i]] := length(needle) - i -1;
Ни одного сравнения, а сравнение, как считается, самая долгая операция.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием