Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Цитата:
что скорость сравнения символа с символом проходит гораздо дольше сравнения числа с числом.
Гм.
Код:
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
Найди 5 отличий.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 27.03.2014 в 18:14.
Ответить с цитированием
  #17  
Старый 27.03.2014, 18:09
Аватар для Facepalm
Facepalm Facepalm вне форума
Прохожий
 
Регистрация: 03.02.2013
Сообщения: 40
Репутация: 2552
Злость

Цитата:
Сообщение от seeman_tm
Советую глянуть такую темку на данном форуме как "Соотношение скоростей операций".
Похоже вы не знаете внутреннего устройства дельфи и пытаетесь людей носом тыкать в свои никчемные записульки и пытаетесь всем доказать, какой вы вумный и не хотите признавать свою неправоту.
__________________
Ну ты понел ^_^.

Последний раз редактировалось Facepalm, 27.03.2014 в 18:11.
Ответить с цитированием
  #18  
Старый 27.03.2014, 18:43
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Вот результат тестирования трех функций.
Цитата:
Тест первый
Массив: 0D, 0A
Подмассив: 0D, 0A, 0D, 0A

Функция lArrayPos
Результат функции: -1
Среднее время выполнение функции: 0,00163093354043601 ms.
Количество вызовов функции: 1000

Функция ArrFind
Результат функции: -1
Среднее время выполнение функции: 0,00187481928569134 ms.
Количество вызовов функции: 1000

Функция SubArrPos
Результат функции: 0 (Функция возвращает не верный результат)
Среднее время выполнение функции: 0,00163847639853669 ms.
Количество вызовов функции: 1000


Тест второй
Массив: 0D, 0A, 0D, 0A
Подмассив: 0D, 0A, 0D, 0A

Функция lArrayPos
Результат функции: 0
Среднее время выполнение функции: 0,00164071131945541 ms.
Количество вызовов функции: 1000

Функция ArrFind
Результат функции: 0
Среднее время выполнение функции: 0,00189521293907466 ms.
Количество вызовов функции: 1000

Функция SubArrPos
Результат функции: 0
Среднее время выполнение функции: 0,001623949412565 ms.
Количество вызовов функции: 1000


Тест третий
Массив: 75, 73, 65, 72, 6E, 61, 6D, 65, 3D, 75, 73, 65, 72, 5F, 6E, 61, 6D, 65, 26, 70, 61, 73, 73, 77, 6F, 72, 64, 3D, 70, 61, 73, 73, 77, 6F, 72, 64, 0D, 0A, 30, 0D, 0A, 0D, 0A, 0D, 0A
Подмассив: 0D, 0A, 0D, 0A

Функция lArrayPos
Результат функции: 39
Среднее время выполнение функции: 0,00173793037941973 ms.
Количество вызовов функции: 1000

Функция ArrFind
Результат функции: 39
Среднее время выполнение функции: 0,00201282565242231 ms.
Количество вызовов функции: 1000

Функция SubArrPos
Результат функции: 40 (Функция возвращает не верный результат)
Среднее время выполнение функции: 0,00195667326433946 ms.
Количество вызовов функции: 1000


Тест четвёртый
Массив: 0D, 0A, 0D, 0B, ..., 0B, 0D, 0A,0D,0A (Длинна массива 4000 элементов)
Подмассив: 0D, 0A, 0D, 0A

Функция lArrayPos
Результат функции: 3996
Среднее время выполнение функции: 0,0157112146934876 ms.
Количество вызовов функции: 1000

Функция ArrFind
Результат функции: 3996
Среднее время выполнение функции: 0,00864160109734617 ms.
Количество вызовов функции: 1000

Функция SubArrPos
Результат функции: 0 (Функция возвращает не верный результат)
Среднее время выполнение функции: 0,0489961713011011 ms.
Количество вызовов функции: 1000

Из тестов видно, что хоть функция ArrFind и уступает на малых объёмах массива в котором производится поиск из-за выполнения предварительных операций по формированию таблицы, но на больших объёмах она берёт безоговорочное первенство. Единственное что её пришлось допилить, это проверку на длину массива и подмассива (т.к. если функции передать любой из массивов длиной равной нулю, то происходит ошибка). И в случае если подмассив отсутствует в массиве, то возвращать результат -1.

Что касается функции SubArrPos, то она мало того, что мягко говоря грешит, так и в скорости отстаёт от своих конкурентов прилично.

Последний раз редактировалось seeman_tm, 27.03.2014 в 19:03.
Ответить с цитированием
  #19  
Старый 27.03.2014, 19:08
Аватар для madMonia
madMonia madMonia вне форума
Новичок
 
Регистрация: 25.02.2014
Сообщения: 50
Версия Delphi: Delphi XE3
Репутация: 2545
По умолчанию

Цитата:
Сообщение от seeman_tm
Вот результат тестирования трех функций.

Что касается функции SubArrPos, то она мало того, что мягко говоря грешит, так и в скорости отстаёт от своих конкурентов прилично.

Специально проверил на этих убогих тестах (хотя и так был уверен в результате), и SubArrPos возвращает последовательно -1, 0, 39 и 3996. Видимо ты опять что-то сделал не так.

Ну и твое рукожопое поделие lArrayPos, никак не может быть быстрее SubArrPos, чтобы убедится в этом достаточно бросить взгляд на код. Ты и с таймингом похоже накосячил. Или смухлевал?

Между прочим, моя SubArrPos дважды взяла приз "лучшая функция для поиска по подмассиву байтов", в 2004 и 2005 на чемпионате мира и его окресностей среди функций. А чем может похвастаться твое исчадие?
__________________
Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров
Ответить с цитированием
  #20  
Старый 27.03.2014, 19:26
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от madMonia
Специально проверил на этих убогих тестах (хотя и так был уверен в результате), и SubArrPos возвращает последовательно -1, 0, 39 и 3996. Видимо ты опять что-то сделал не так.

Ну и твое рукожопое поделие lArrayPos, никак не может быть быстрее SubArrPos, чтобы убедится в этом достаточно бросить взгляд на код. Ты и с таймингом похоже накосячил. Или смухлевал?

Между прочим, моя SubArrPos дважды взяла приз "лучшая функция для поиска по подмассиву байтов", в 2004 и 2005 на чемпионате мира и его окресностей среди функций. А чем может похвастаться твое исчадие?

На счёт того, кто мухлюет.
Почему вы, уважаемый, отредактировали на форуме исходник, но не сообщили об этом ? Не надо заниматься подлогом. У меня ваш исходник из поста с самого начала без изменений имеется. Я в нём ни чего не менял, ни одного пробела. Так почему же вы в тихую изменили свой исходник, умолчали об этом и продолжаете меня обвинять в якобы допущенных ошибках ?

Ваш код имел следующий вид.
Код:
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  
Старый 27.03.2014, 19:34
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Провёл повторно четвёртый тест.
Цитата:
Массив: 0D, 0A, 0D, 0B, ..., 0B, 0D, 0A,0D,0A (Длинна массива 4000 элементов)
Подмассив: 0D, 0A, 0D, 0A

Функция lArrayPos:
Результат функции: 3996
Среднее время выполнение функции: 0,0158095512139113 ms.
Количество вызовов функции: 1000


Функция ArrFind:
Результат функции: 3996
Среднее время выполнение функции: 0,00938806468419869 ms.
Количество вызовов функции: 1000

Функция SubArrayPos:
Результат функции: 3996
Среднее время выполнение функции: 0,0520334288296418 ms.
Количество вызовов функции: 1000

Да, без спорно, у вашей функции имеется рекорд по медлительности.
Ответить с цитированием
  #22  
Старый 27.03.2014, 19:39
Аватар для madMonia
madMonia madMonia вне форума
Новичок
 
Регистрация: 25.02.2014
Сообщения: 50
Версия Delphi: Delphi XE3
Репутация: 2545
По умолчанию

Цитата:
Сообщение от seeman_tm
На счёт того, кто мухлюет.
Почему вы, уважаемый, отредактировали на форуме исходник, но не сообщили об этом ? Не надо заниматься подлогом. У меня ваш исходник из поста с самого начала без изменений имеется. Я в нём ни чего не менял, ни одного пробела. Так почему же вы в тихую изменили свой исходник, умолчали об этом и продолжаете меня обвинять в якобы допущенных ошибках ?
Как смеешь ты обвинять ни в чем неповинных людей?! Неожидал встретить подобную нечистоплотность. Думаешь эта твоя функция стоит того, чтобы врать ради нее, подтасовывать результаты? Бог тебе судья

Цитата:
Сообщение от seeman_tm
Провёл повторно четвёртый тест.

Может хватит уже врать-то. Видно же, что подтасованы результаты. Ты цифры-то видно из головы берешь
__________________
Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров

Последний раз редактировалось madMonia, 27.03.2014 в 19:41.
Ответить с цитированием
  #23  
Старый 27.03.2014, 19:50
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
Смех

Цитата:
Сообщение от madMonia
Как смеешь ты обвинять ни в чем неповинных людей?! Неожидал встретить подобную нечистоплотность. Думаешь эта твоя функция стоит того, чтобы врать ради нее, подтасовывать результаты? Бог тебе судья

Может хватит уже врать-то. Видно же, что подтасованы результаты.

С моей стороны ни чего не подтасовывается.
А вот место того, чтоб слепо писать посты, вы бы взяли и проверили, что да как работает.

Цитата:
Сообщение от madMonia
Ты цифры-то видно из головы берешь

Не, не из головы. Я специально функцию отдельно написал, чтоб она предвзято относилась к функции SubArrayPos, накручивала счётчик тактов и мешала давать ей правильный результат.

Последний раз редактировалось seeman_tm, 27.03.2014 в 20:36.
Ответить с цитированием
  #24  
Старый 27.03.2014, 20:11
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Вот ещё в нагрузку.

Тест пятый
Массив: 0D, 0A, 0D, 0B, ..., 0B, 0D, 0A,0D,0A (Длинна массива 4000000 элементов)
Подмассив: 0D, 0A, 0D, 0A

Цитата:
__________________________________________________
| Результат | Время выполнения |Название функции|
__________________________________________________
| 3999996 | 16,4242164856148 ms. | lArrayPos |
__________________________________________________
| 3999996 | 7,30943513770605 ms. | ArrFind |
__________________________________________________
| 3999996 | 49,2529290733878 ms. | SubArrayPos |
__________________________________________________

И так.
Функция ArrFind получает золотую, серебряную и бронзовую медали в номинации "Самая быстрая функция поиска подмассива в массиве".
Функция SubArrayPos тоже получает золотую медать, но только в номинации "Самая медленная функция поиска подмассива в массиве".
Функция lArrayPos ни чего не получает, т.к. она не для этого писалась.

Последний раз редактировалось seeman_tm, 27.03.2014 в 20:32.
Ответить с цитированием
  #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.

Последний раз редактировалось Bargest, 27.03.2014 в 22:50.
Ответить с цитированием
  #26  
Старый 28.03.2014, 00:50
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от Bargest
to seeman_tm,
Советую не реагировать так болезненно на чьи-то ошибки или недочеты - разжигаешь массовый срач. Если видишь у кого-то ошибку - не так сложно написать не в стиле "Гениально. Вот только вам опять в голову не пришло", а в стиле "Насколько я знаю, ..." Также не стоит так реагировать на нападки и гневные посты - их не так трудно проигнорировать.
У тебя ошибки в понимании тоже есть, об одной из них я писал. Но я ж не кричу по этому поводу в стиле тролля. Спокойнее надо быть.

В вашей функции тоже была найдена ошибка, так вы же не стали доказывать мне, что функция полностью рабочая, а перепроверили, нашли и исправили без неуместного понта. За что нижайший поклон.
К стати. Подправьте функцию в посте если не сложно. Т.к. мало ли кому понадобится.

Что касательно остальных. То они палец о палец лишний раз не ударили. Ни кто не попробовал проверить то, что я описал. А критиковать, обвинять в подтасовках и спорить пытаются.

Последний раз редактировалось seeman_tm, 28.03.2014 в 01:23.
Ответить с цитированием
  #27  
Старый 28.03.2014, 09:37
Аватар для madMonia
madMonia madMonia вне форума
Новичок
 
Регистрация: 25.02.2014
Сообщения: 50
Версия Delphi: Delphi XE3
Репутация: 2545
По умолчанию

Цитата:
Сообщение от Bargest
Сомневаюсь.

Да не вопрос, я просто паскалевский код позекс взял чтоб потроллеть

Жаль что у них паскалевский вариант слабоват, не так смешно получилсоь.
Ну вот типо, чемпионка мира и окресностей номер два
Код:
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;
__________________
Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter