|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Цитата:
Код:
var ac, bc: AnsiChar; ai, bi: byte; fc, fi: boolean; begin asm nop;nop;nop;nop;end; fc := ac = bc; fi := ai = bi; end. Код:
nop nop nop nop // первая строка mov al, ds:byte_421ED8 cmp al, ds:byte_421ED9 setz ds:byte_421EDC // вторая строка mov al, ds:byte_421EDA cmp al, ds:byte_421EDB setz ds:byte_421EDD jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 27.03.2014 в 18:14. |
#17
|
||||
|
||||
Цитата:
Ну ты понел ^_^. Последний раз редактировалось Facepalm, 27.03.2014 в 18:11. |
#18
|
||||
|
||||
Вот результат тестирования трех функций.
Цитата:
Из тестов видно, что хоть функция ArrFind и уступает на малых объёмах массива в котором производится поиск из-за выполнения предварительных операций по формированию таблицы, но на больших объёмах она берёт безоговорочное первенство. Единственное что её пришлось допилить, это проверку на длину массива и подмассива (т.к. если функции передать любой из массивов длиной равной нулю, то происходит ошибка). И в случае если подмассив отсутствует в массиве, то возвращать результат -1. Что касается функции SubArrPos, то она мало того, что мягко говоря грешит, так и в скорости отстаёт от своих конкурентов прилично. Последний раз редактировалось seeman_tm, 27.03.2014 в 19:03. |
#19
|
||||
|
||||
Цитата:
Специально проверил на этих убогих тестах (хотя и так был уверен в результате), и SubArrPos возвращает последовательно -1, 0, 39 и 3996. Видимо ты опять что-то сделал не так. Ну и твое рукожопое поделие lArrayPos, никак не может быть быстрее SubArrPos, чтобы убедится в этом достаточно бросить взгляд на код. Ты и с таймингом похоже накосячил. Или смухлевал? Между прочим, моя SubArrPos дважды взяла приз "лучшая функция для поиска по подмассиву байтов", в 2004 и 2005 на чемпионате мира и его окресностей среди функций. А чем может похвастаться твое исчадие? Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров |
#20
|
||||
|
||||
Цитата:
На счёт того, кто мухлюет. Почему вы, уважаемый, отредактировали на форуме исходник, но не сообщили об этом ? Не надо заниматься подлогом. У меня ваш исходник из поста с самого начала без изменений имеется. Я в нём ни чего не менял, ни одного пробела. Так почему же вы в тихую изменили свой исходник, умолчали об этом и продолжаете меня обвинять в якобы допущенных ошибках ? Ваш код имел следующий вид. Код:
function SubArrayPos(const SubArr, Arr: array of byte; Offset: Integer): Integer; var I, LIterCnt, L, J: Integer; PSubStr, PS: PByte; begin L := Length(SubArr); { Calculate the number of possible iterations. Not valid if Offset < 1. } LIterCnt := Length(Arr) - Offset - L; { Only continue if the number of iterations is positive or zero (there is space to check) } if (LIterCnt >= 0) and (L > 0) then begin PSubStr := @SubArr[0]; PS := @Arr[0]; Inc(PS, Offset - 1); 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); end; end; Result := 0; end; |
#21
|
||||
|
||||
Провёл повторно четвёртый тест.
Цитата:
Да, без спорно, у вашей функции имеется рекорд по медлительности. |
#22
|
||||
|
||||
Цитата:
Цитата:
Может хватит уже врать-то. Видно же, что подтасованы результаты. Ты цифры-то видно из головы берешь Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров Последний раз редактировалось madMonia, 27.03.2014 в 19:41. |
#23
|
||||
|
||||
Цитата:
С моей стороны ни чего не подтасовывается. А вот место того, чтоб слепо писать посты, вы бы взяли и проверили, что да как работает. Цитата:
Не, не из головы. Я специально функцию отдельно написал, чтоб она предвзято относилась к функции SubArrayPos, накручивала счётчик тактов и мешала давать ей правильный результат. Последний раз редактировалось seeman_tm, 27.03.2014 в 20:36. |
#24
|
||||
|
||||
Вот ещё в нагрузку.
Тест пятый Массив: 0D, 0A, 0D, 0B, ..., 0B, 0D, 0A,0D,0A (Длинна массива 4000000 элементов) Подмассив: 0D, 0A, 0D, 0A Цитата:
И так. Функция ArrFind получает золотую, серебряную и бронзовую медали в номинации "Самая быстрая функция поиска подмассива в массиве". Функция SubArrayPos тоже получает золотую медать, но только в номинации "Самая медленная функция поиска подмассива в массиве". Функция lArrayPos ни чего не получает, т.к. она не для этого писалась. Последний раз редактировалось seeman_tm, 27.03.2014 в 20:32. |
#25
|
||||
|
||||
Цитата:
В коде Код:
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; 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; str[i + j] <> substr[j] for j := 0 to LS (с верхней границей) Либо вовсе одно, если компилятор умный и додумается сравнивать в обратном порядке или завести два регистра - один для for с декрементом, а другой, собственно, j. В любом случае, в критической части получаем как минимум на одно сравнение больше, остальная же идея кода полностью идентична: сравнивать, начиная с каждого байта, пока не встретим расхождение. А следовательно, код вероятнее всего медленнее. to seeman_tm, Советую не реагировать так болезненно на чьи-то ошибки или недочеты - разжигаешь массовый срач. Если видишь у кого-то ошибку - не так сложно написать не в стиле "Гениально. Вот только вам опять в голову не пришло", а в стиле "Насколько я знаю, ..." Также не стоит так реагировать на нападки и гневные посты - их не так трудно проигнорировать. У тебя ошибки в понимании тоже есть, об одной из них я писал. Но я ж не кричу по этому поводу в стиле тролля. Спокойнее надо быть. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 27.03.2014 в 22:50. |
#26
|
||||
|
||||
Цитата:
В вашей функции тоже была найдена ошибка, так вы же не стали доказывать мне, что функция полностью рабочая, а перепроверили, нашли и исправили без неуместного понта. За что нижайший поклон. К стати. Подправьте функцию в посте если не сложно. Т.к. мало ли кому понадобится. Что касательно остальных. То они палец о палец лишний раз не ударили. Ни кто не попробовал проверить то, что я описал. А критиковать, обвинять в подтасовках и спорить пытаются. Последний раз редактировалось seeman_tm, 28.03.2014 в 01:23. |
#27
|
||||
|
||||
Цитата:
Да не вопрос, я просто паскалевский код позекс взял чтоб потроллеть Жаль что у них паскалевский вариант слабоват, не так смешно получилсоь. Ну вот типо, чемпионка мира и окресностей номер два Код:
function Search(Const Arr, SubArr: Array Of Byte; Offset: Integer = 0): Integer; var SubStr: AnsiString; Str: AnsiString; begin SetString(SubStr,PChar(@SubArr[Low(SubArr)]),Length(SubArr)); SetString(Str,PChar(@Arr[Low(Arr)]),Length(Arr)); Result :=System.Pos(SubStr, Str, Offset + 1 - Low(Arr)) - 1 + Low(Arr); end; Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров |