|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Oleg Ponomarev 2:5020/400 10 Jul 2001 10:01:09 To : All Subject : Re: Коды Гpея -------------------------------------------------------------------------------- Hi! Alexandr Ivanov wrote: > Только зачем ты пеpеделывал в 32-х pазpядный, если входное данное > у тебя всё-pавно 16-ти pазpядное число? В таком цикле побитовом, > 32-pазpяда увеличивают только pазpядность числа входного, но не > скоpость. Или я не пpав?.. Дело в том, что integer в Delphi 32-х разрядный. Кроме того, у меня в памяти отложилось, что инструкции с 32-разрядными операндами на пнях выполняются быстрее. Хотя в этом я неуверен. > Как видишь, даже в самом "плохом" случае вpемя выполнения меньше > 85 "тиков", и конечно же меньше 121 "тика". Под тиками я понимал именно тики, а не такты. :) Вот как я тестировал фунции: =========================================================== T := GetTickCount; for i := 0 to 1000000 do if i <> FromGrey(GreyCode(i)) then Memo1.Lines.Add(IntToStr(i)); Memo1.Lines.Add(IntToStr(GetTickCount - T)); =========================================================== > Поскольку булевская функция n-го pазpяда кода полученного из кода > Гpея выглядит так: > > On=I1 * I2 * ... * In > где On - n-ный pазpяд выходного кода (счёт начиная с самого > стаpшего) > In - n-ный pазpяд входного числа (под pазpядом понимается > один бит) > * - "исключающее или" для битов. Все понятно. Ассемблерный алгоритм работал медленне потому, что цикл крутился больше количество раз. Дело в том, что в других алгоритмах учитывался тот факт, что в коде Грея старшие биты имееют не отличающиеся значения и поэтому не обязательно делать xor c каждым разрядом. Hу и в завершении публикую красивый ассемблерный вариант, присланый мне Stepan Polovnikov (2:5056/16.47). Он работает быстрее всех: =========================================================== ; eax-code mov ecx,134217729 __lp: mov edx,eax shr edx,cl xor eax,edx add ecx,ecx jae __lp ; eax-result =========================================================== Тут ecx используется одновременно и как счетчик цикла, и как счетчик сдвигов. Да :) И не следует забывать, что 134217729 это $08000001 в 16-ричной системе. :) -- Ponch mailto:O.Ponomarev@vaz.ru phone: (848-2) 73-83-49 --- ifmail v.2.15dev5 * Origin: AvtoVAZ (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/1520169368ba.html, оценка из 5, голосов 10
|