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

...
Google Search
Forth-FAQ Spy Grafic

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




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

Зарегистрирован: Сб май 13, 2006 23:37
Сообщения: 380
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Для справки, это не мой метод, а Вегнера. А широким массам он известен по
знаменитой книжке Кернигана/Ричи "Язык программирования Си"


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Mihail писал(а):
Что за каталог SPF ? Нужно записать в католог \src и там запустить compile.bat

Да верно. В каталоге \src это делается.
Mihail писал(а):
CREATE [BITS-WORD] 0x10000 ALLOT

И это правильно. 65536 перевел в 0xFFFF, а это 0x10000.
строчку OVER 80B60F = OR \ MOVZX EAX, BYTE PTR [EAX] в DUP7B? оптимизатора добавил.
Результат:
Elapsed time: 00:00:01:906 - AlexF
Elapsed time: 00:00:00:594 - Mihail
Elapsed time: 00:00:00:360 - chess

Да насчет генерации таблицы на 0х100000000 значений - оперативная память компа д.б. 8 Gb. :roll:

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Хм... тоже размять мозги?

Код:
; число в edx

xor eax, eax
mov ebx, eax
mov ecx, 32

L1:
shr edx, 1
adc eax, ebx
jecxz L1

; число бит в eax


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

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

Код:
; число в edx

xor eax, eax
mov ebx, eax
mov ecx, 32

L1:
shr edx, 1
adc eax, ebx
jecxz L1

; число бит в eax

думаю, что будет то же, что и у меня, так как алгоритм тот же практически, что и у меня. А табличный метод, как и положено быстрее, так как во-первых времени требует в любом случае одинаково - то есть нет зависимости от кол-ва бит в проверяемом числе, и это время заведомо меньше.


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Все-таки решил посмотреть что даст ассемблер по сравнению с фортом.
Вариант (табличный) на ассме.
Код:
\ Case3 --------------------------------------------------
REQUIRE ASSEMBLER lib\ext\spf-asm.f

: BITS-WORD \ word --> i
DUP 0x5555 AND SWAP 0xAAAA AND 1 RSHIFT +
DUP 0x3333 AND SWAP 0xCCCC AND 2 RSHIFT +
DUP 0x0F0F AND SWAP 0xF0F0 AND 4 RSHIFT +
DUP 0x00FF AND SWAP 0xFF00 AND 8 RSHIFT +
;

CREATE [BITS-WORD] 0x10000 ALLOT

: GEN-TBL-WORD
[BITS-WORD] 0x10000 + [BITS-WORD]
DO
  I [BITS-WORD] - BITS-WORD I C!
LOOP
;

GEN-TBL-WORD

\ ----- Testing ------
    1024 CONSTANT KB
KB KB * CONSTANT MB

100 MB * CONSTANT BytesInArray

\ Выделние тестового масиива
\ USER Array
  BytesInArray ALLOCATE THROW CONSTANT Array

\ Заполнение массива
: FillArray
  BytesInArray 0 DO
    I 256 MOD I Array  + C!
  LOOP
; FillArray

BytesInArray Array + CONSTANT ARRAY-END
Array CONSTANT ARRAY-BEG

CODE Case3
LEA EBP, -4 [EBP]            \ сохраняем ТОС в стеке
MOV [EBP], EAX
MOV EAX, # 0                 \ устанавливаем счетчик в 0
MOV ECX, # ARRAY-BEG         \ а-нач
MOV EDX, # ARRAY-END         \ а-кон
MOV ESI, # [BITS-WORD]       \ а-таблицы символов
@@1:
MOVZX EBX, WORD [ECX]
MOVZX EBX, BYTE [EBX] [ESI]  \ читаем количество бит из слова
ADD EAX, EBX                 \ добавляем в счетчик
LEA ECX, 2 [ECX]             \ увеличиваем адрес для чтения очередного слова массива
CMP ECX, EDX
JNG SHORT @@1                \ уходим в начало цикла
RET
END-CODE

\ Засекаем на время
REQUIRE time-reset G:/spf/devel/~af/lib/elapse.f
REQUIRE .elapsed   G:/spf/devel/~af/lib/elapse.f

time-reset Case3 .elapsed CR


Код:
Elapsed time: 00:00:00:125


Есть, есть еще форту куда развиваться.

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Ассемблер может еще быстрее.

Код:
....... \ предыдущий код на форте не меняется

CODE Case3
LEA EBP, -4 [EBP]            \ сохраняем ТОС в стеке
MOV [EBP], EAX
MOV EAX, # 0                 \ устанавливаем счетчик в 0
MOV ECX, # ARRAY-BEG         \ а-нач
MOV ESI, # [BITS-WORD]       \ а-таблицы символов
@@1:
MOV EBX, [ECX]               \ читаем ячейку из массива
MOV EDX, EBX
AND EBX, # 0xFFFF
MOVZX EBX, BYTE [EBX] [ESI]  \ читаем количество бит из мл.слова ячейки
ADD EAX, EBX                 \ добавляем в счетчик
SHR EDX, # 0x10
MOVZX EBX, BYTE [EDX] [ESI]  \ читаем количество бит из ст.слова ячейки
ADD EAX, EBX                 \ добавляем в счетчик
LEA ECX, 4 [ECX]             \ увеличиваем адрес для чтения очередной ячейки массива
CMP ECX, # ARRAY-END
JNG SHORT @@1                \ уходим в начало цикла
RET
END-CODE

\ Засекаем на время, что быстрее
REQUIRE time-reset G:/spf/devel/~af/lib/elapse.f
REQUIRE .elapsed   G:/spf/devel/~af/lib/elapse.f

time-reset Case3 .elapsed CR

Код:
Elapsed time: 00:00:00:094

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


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

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Корректнее приводить цифры и по другим методам. :) По крайней мере с аналогоичным методом, но писанного на Форте.


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Кажется, тема более подходит для этого раздела. Переместил.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


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

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


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

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


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

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