Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 00:18

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 17, 2007 00:39 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Там где быстродействие непогнятно, кто 1 кто 2 кто :lol:

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 17, 2007 00:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
Там где быстродействие непогнятно, кто 1 кто 2 кто

там где числа меньше, там скорость выше 8)
скорость меряетсяя в тиках процессора.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 17, 2007 01:36 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
вопрос писал(а):
Там где быстродействие непогнятно, кто 1 кто 2 кто

там где числа меньше, там скорость выше 8)
скорость меряетсяя в тиках процессора.

Я прошу прощения за дотошность, но количество примеров не совпадает с количеством участников в первой табличке, который из админов :D 1, который - 2, за пояснение по поводу тиков - тоже спасибо

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 17, 2007 01:47 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
Я прошу прощения за дотошность, но количество примеров не совпадает с количеством участников в первой табличке, который из админов 1, который - 2

все примеры выложены на: http://www.forth.org.ru/~mOleg/samples/2007-11-11/
и там все номера присутствуют.
Замечу, что с winglion-оской наброской игрался я, и она немного не так выглядит, как предложил это winglion,
к сожалению пришлось некоторые решения доводить лично до приемлемого для тестирования состояния 8(

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 17, 2007 19:35 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Вот еще вариант.
Код:
( ОПРЕДЕЛИТЕЛЬНОЕ СЛОВО ДЛЯ ПОЛУЧЕНИЯ СТЕПЕНЕЙ ЧИСЛА ДВА )
: _2POWER
   CREATE ( n - )   1 DUP , SWAP  0 ?DO  2* DUP ,  LOOP  DROP
   DOES> ( n - 2^n )  SWAP CELLS + @ ;

( СТЕПЕНИ ДВОЙКИ ОТ 2^0 ДО 2^31 )
32 _2POWER  2POWER

( получение реверса числа)
: REVCELL ( # - # )
   DUP IF  0 SWAP  32 0 ?DO  DUP 0< IF  SWAP I 2POWER + SWAP  THEN  2*  LOOP  DROP
   THEN ;

: REVARR ( addr # -  )
   0 ?DO  DUP @  REVCELL OVER !  CELL+  LOOP  DROP ;

Получение значений степеней двойки из масива можно заменить на операции сдвига и тогда массив не нужен
Код:
I 2POWER --> 1 I LSHIFT
, а суммирование можно заменить на OR

Можно получить числа, а потом их сложить:
Код:
: REVCELL ( # - # )
   DUP IF  DEPTH >R
      #32 0 ?DO  DUP 0< IF  I 2POWER SWAP  THEN  2*  LOOP  DROP
      DEPTH R> - 0 ?DO OR LOOP
   THEN ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 18, 2007 07:28 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Alexander писал(а):
Вот еще вариант.

на моем P4M 2G
Alexander1 100 | 1,377,900,276 | 13,779,002
Alexander2 100 | 1,974,338,136 | 19,743,381

последний предложенный вариант у меня рекордсмен по тормозам

да, прошу обратить внимание, что СПФ чувствителен к регистру, поэтому REVARR и revarr - разные слова.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 18, 2007 18:57 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
последний предложенный вариант у меня рекордсмен по тормозам

:D не мудрено, так как много DO LOOP структур

Протестировал на своем CeleronM 380 1,6ГГц, 1,5Гб ОЗУ
при проходе 100 раз массива в 16000 ячеек среднее время на одну итерацию:
вариант с циклическими сдвигами (инструкцию ROL дописал руками) - 575,54 мкс
вариант со сдвигом вправо (ассемблерный код, который не тестировался на SPF) - 999,88 мкс
вариант с таблицей значений - 18936,17 мкс
вариант со сдвигом влево - 5247,92 мкс
Код:
: REVCELL ( # - # )
   DUP IF 0 SWAP #32 0 ?DO  DUP 0< IF SWAP 1 I LSHIFT +  SWAP THEN  2*  LOOP  DROP
   THEN ;

Данные получены с исползованием Windows API QueryPerformanceFrequency
На других системах может быть другое время (зависит от архитектуры проца и кэша)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 19, 2007 10:58 
Не в сети
Аватара пользователя

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
теперь если кто за хочет сравнить тесты он легко набросает утилитку на основе указаной апи QueryPerformanceFrequency и узнает какое относительное быстродействие проявил даный олгаритм на CeleronM 380 1,6ГГц, 1,5Гб ОЗУ

_________________
SPF


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 19, 2007 18:59 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Ассемблерный вариант в лоб на командах циклического сдвига(время исполнения не зависит от количества 1-х битов - поэтому это не самый быстрый вариант)
Код:
: revcell  $ 20 bC=b# L1: 1Ac<< 1Dc>> bC-- L1 JNZ A=D ;

: @TSC-LO  DUP DA=TSC ;
: tics. @TSC-LO >R revcell @TSC-LO R> - @TSC-LO >R @TSC-LO R> - - NIP . ;

\ EOF
STARTLOG
SEE revcell
\ проверка
HEX CR
0x87654321 revcell DUP CR U. revcell CR U.
DECIMAL
CR
CR  0xFFFFFFFF tics. \ время исполнения в тиках процессора
CR

Лог
Код:
CODE revcell
591B90 C6C120           MOV     CL , # 20
591B93 D1D0             RCL     EAX , 1
591B95 D1DA             RCR     EDX , 1
591B97 FEC9             DEC     CL
591B99 75F8             JNE     591B93
591B9B 8BC2             MOV     EAX , EDX
591B9D C3               RET     NEAR
END-CODE

84C2A6E1
87654321

137

Ok

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 28, 2007 16:24 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Варианты с таблицами...
Вариант 0 (экономим память)
Код:
CREATE (REVVAL_4)
   0 , 8 , 4 , $C , 2 , $A , 6 , $E , 1 , 9 , 5 , $D , 3 , $B , 7 , $F ,
: (REVCELL)
   DUP $F AND CELLS (REVVAL_4) + @ #28 LSHIFT
   OVER 4 RSHIFT $F AND CELLS (REVVAL_4) + @ #24 LSHIFT OR
   OVER 8 RSHIFT $F AND CELLS (REVVAL_4) + @ #20 LSHIFT OR
   OVER #12 RSHIFT $F AND CELLS (REVVAL_4) + @ #16 LSHIFT OR
   OVER #16 RSHIFT $F AND CELLS (REVVAL_4) + @ #12 LSHIFT OR
   OVER #20 RSHIFT $F AND CELLS (REVVAL_4) + @ #8 LSHIFT OR
   OVER #24 RSHIFT $F AND CELLS (REVVAL_4) + @ #4 LSHIFT OR
   OVER #28 RSHIFT $F AND CELLS (REVVAL_4) + @ OR  NIP ;

Выше приведенное самодостаточно, но кто хочет увеличить быстродействие добавьте следующее
Вариант 1 (баланс скорость/память)
Код:
: (REVVAL)  CREATE  1 8 LSHIFT 0 DO I (REVCELL) #24 RSHIFT , LOOP ;  (REVVAL) REVVAL
: REVCELL
   DUP $FF AND CELLS REVVAL + @ #24 LSHIFT
   OVER 8 RSHIFT $FF AND CELLS REVVAL + @ #16 LSHIFT OR
   OVER 16 RSHIFT $FF AND CELLS REVVAL + @ 8 LSHIFT OR
   OVER #24 RSHIFT $FF AND CELLS REVVAL + @ OR  NIP ;

Вариант 2 (быстродействие)
Код:
: (REVVAL)  CREATE  1 16 LSHIFT 0 DO I (REVCELL) #16 RSHIFT , LOOP ;  (REVVAL) REVVAL
: REVCELL
   DUP $FFFF AND CELLS REVVAL + @ #16 LSHIFT
   OVER #16 RSHIFT $FFFF AND CELLS REVVAL + @ OR  NIP ;

Для массива ничего не изменилось.
Код:
: REVARR ( a n -  )
   0 ?DO  DUP @ REVCELL OVER ! CELL+  LOOP  DROP ;

Код написан для SwiftForth.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB