Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 19:32

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: *замер скорости выполнения алгоритма
СообщениеДобавлено: Пн апр 28, 2008 22:15 
Не в сети
Moderator
Moderator
Аватара пользователя

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

Общий вид решения обсуждаем (предлагайте интерфейс, синтаксис, решение).

Решение победителя будет использоваться в дальнейшем ;)


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

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
А вот это дельная тема, может тогда все задачи на конкурс выставлять для развития нужных вещей в форте.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
переписать компилатор с автоматическим добавлением измерителей к каждому слову ...
А что имеется ввиду (для не самых понятливых)?

То, что я могу предлоить в меру понимания, это не более чем "копия" известных мне дибаггеров

Для целей испытания каждое слово компилируется так, что
- если в системе присутствует значение 1 у переменной "DEBUG", И если слово вызвано отдельно - происходит переход на такой код, в который включены куски измерителей
- если в системе нулевое значение переменной "DEBUG", ИЛИ если слово вызвано из другого слова (как часть кода) - переход на обычный код
- значение 2 у переменной даст вызов слова с измерением независимо от того, вызвано оно само по себе или в рамках другого слова

Также может быть полезно организовать слово "многократный вызов" , где вызов каждого слова осуществлялся многократно с восстановлением стека перед вызовом или\и участка памяти
ИМХО, разумеется
Я всё таки пока слабо компетентен в Форте

Там, где я что-то тестирую, у меня почти всегда есть функция, формирующая рапорт о результате в удобоваримом виде

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 29, 2008 12:34 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Для измерения скорости библиотека:
Код:
~pinka/lib/tools/profiler.f
не, не подойдет? Думаю, очень хороший вариант. Протестирован. Работает. На форуме достаточно часто ссылались на ее результаты при сравнении нескольких фрагментов.

Подключается с того места кода, откуда нужно отслеживать статистику вызова слов, и далее вывод.
Код:
REQUIRE  ResetProfiles ~pinka/lib/tools/profiler.f
: col Color ; : point Point ;
: pt1 { ii jj -- }  255 ii jj rgb col    ii 20 + jj 20 + point  ;

.... и далее определение слов, статистику по которым нужно собрать ....

ResetProfiles \ обнулили счетчики
    grad-zal    \ запустили измеряемый фрагмент...
.AllStatistic   \ вывели статистику


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

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

я не понял, откуда вы взяли цитату. Компилятор переписывать ни в коем случае не надо! Надо наиболее портируемое решение, позволяющее на любом(в идеале) форте запускать указанные слова.

вопрос писал(а):
То, что я могу предлоить в меру понимания, это не более чем "копия" известных мне дибаггеров

дебаггер, он совсем не в ту тему. Нужно не дебагить, а замерять время исполнения кода, каким образом - это уже второй момент.

Еще раз, не нужно мерить время работы каждого слова в задаче (для этого профайлер есть).
Надо мерить только время работы указанного куска кода. Вопрос в лучшем синтаксическом окружении, и простейшем, но гарантированно и точно работающей методики.

AlexF писал(а):
Для измерения скорости библиотека: Код:~pinka/lib/tools/profiler.f не, не подойдет? Думаю, очень хороший вариант.

уже обсуждалось - там есть косяки. Меряет не всегда адекватно, и не совсем применим для нас. Размер кода тоже не замеряется.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс май 04, 2008 07:46 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
mOleg писал(а):
Pretorian писал(а):
переписать компилатор с автоматическим добавлением измерителей к каждому слову ...

я не понял, откуда вы взяли цитату. Компилятор переписывать ни в коем случае не надо! Надо наиболее портируемое решение, позволяющее на любом(в идеале) форте запускать указанные слова.

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


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Спокойно! Такая ошибка в цитировании возникает при использовании фичи "цитировать выделеное", если выделить текст в одном посте, а ссылку по ошибке нажать под именем другого юзера.

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


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

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

Код:
0 VALUE cfa  0 VALUE CdT

: @t
POSTPONE DUP
0xC033 W, \ XOR EAX, EAX
0xA20F W, \ CPUID
0x310F W, \ RDTSC
; IMMEDIATE

: METER \ "name" --
' TO cfa 0 TO CdT
10 0
DO @t >R cfa EXECUTE @t R> -
   @t >R             @t R> - -
   I 3 > IF CdT + TO CdT ELSE DROP THEN
LOOP
CdT 6 /
cfa WordByAddr CR TYPE ."  [ " . ." Ticks]"
S0 @ SP!
;

\ EOF
: S1 5 6 NIP ;
: S2 5 6 OVER ;

REQUIRE SEE lib\ext\disasm.f

STARTLOG

METER S1
METER S2

нужна длина кода - дорабатываем SEE

Код:
SEE S1
SEE S2

лог
Код:
S1 [ 5 Ticks]
S2 [ 55 Ticks]

CODE S1
56B6F7 8945FC           MOV     FC [EBP] , EAX
56B6FA B806000000       MOV     EAX , # 6
56B6FF 8D6DFC           LEA     EBP , FC [EBP]
56B702 C3               RET     NEAR
END-CODE
[ 12 Bytes ]


CODE S2
56B713 8945FC           MOV     FC [EBP] , EAX
56B716 C745F805000000   MOV     F8 [EBP] , # 5
56B71D C745F406000000   MOV     F4 [EBP] , # 6
56B724 8B45F8           MOV     EAX , F8 [EBP]
56B727 8D6DF4           LEA     EBP , F4 [EBP]
56B72A C3               RET     NEAR
END-CODE
[ 24 Bytes ]

Ok

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Ассемблерный вариант измерителя времени кода.
Код:
REQUIRE IDN ~chess\assm\sp-assm.f

\ макросы
\ время измеряемого кода и кода его измерителя
MI" dt1  A^A CPUID DA=TSC M1=A B=M0 :B A^A CPUID DA=TSC "MI
\ время кода измерителя
MI" dt2  A^A CPUID DA=TSC M1=A B=M0    A^A CPUID DA=TSC "MI

: METER \ "name" --
' M0=A
dt1 C=M1 A-C M2=A
dt2 C=M1 A-C B=A A=M2 A-B
CR .   \ вывод латентности(актуально для разового исполнения)
dt1 dt1 C=M1 A-C M2=A
dt2 dt2 C=M1 A-C B=A A=M2 A-B
.  \ вывод времени кода в кэше(актуально для исполнения в цикле)
S0 @ SP! ;

\ EOF

: TEST S" 0123456789" 2DUP ;

STARTLOG

METER TEST

SEE METER

лог
Код:
1110 33

CODE METER
5A552B E8081FFCFF       CALL    567438  ( ' )
5A5530 0F6EC0           MOVD    MM0 , EAX
5A5533 33C0             XOR     EAX , EAX
5A5535 0FA2             CPUID
5A5537 0F31             RDTSC
5A5539 0F6EC8           MOVD    MM1 , EAX
5A553C 0F7EC3           MOVD    EBX , MM0
5A553F FFD3             CALL    EBX            \ вызов измеряемого кода
5A5541 33C0             XOR     EAX , EAX
5A5543 0FA2             CPUID
5A5545 0F31             RDTSC
5A5547 0F7EC9           MOVD    ECX , MM1
5A554A 2BC1             SUB     EAX , ECX
5A554C 0F6ED0           MOVD    MM2 , EAX
5A554F 33C0             XOR     EAX , EAX
5A5551 0FA2             CPUID
5A5553 0F31             RDTSC
5A5555 0F6EC8           MOVD    MM1 , EAX
5A5558 0F7EC3           MOVD    EBX , MM0
5A555B 33C0             XOR     EAX , EAX       
5A555D 0FA2             CPUID
5A555F 0F31             RDTSC
5A5561 0F7EC9           MOVD    ECX , MM1
5A5564 2BC1             SUB     EAX , ECX
5A5566 8BD8             MOV     EBX , EAX
5A5568 0F7ED0           MOVD    EAX , MM2
5A556B 2BC3             SUB     EAX , EBX
5A556D E83E07FBFF       CALL    555CB0  ( CR )
5A5572 E8810DFBFF       CALL    5562F8  ( . )
5A5577 33C0             XOR     EAX , EAX
5A5579 0FA2             CPUID
5A557B 0F31             RDTSC
5A557D 0F6EC8           MOVD    MM1 , EAX
5A5580 0F7EC3           MOVD    EBX , MM0
5A5583 FFD3             CALL    EBX
5A5585 33C0             XOR     EAX , EAX
5A5587 0FA2             CPUID
5A5589 0F31             RDTSC
5A558B 33C0             XOR     EAX , EAX
5A558D 0FA2             CPUID   
5A558F 0F31             RDTSC
5A5591 0F6EC8           MOVD    MM1 , EAX
5A5594 0F7EC3           MOVD    EBX , MM0
5A5597 FFD3             CALL    EBX
5A5599 33C0             XOR     EAX , EAX
5A559B 0FA2             CPUID
5A559D 0F31             RDTSC
5A559F 0F7EC9           MOVD    ECX , MM1
5A55A2 2BC1             SUB     EAX , ECX
5A55A4 0F6ED0           MOVD    MM2 , EAX
5A55A7 33C0             XOR     EAX , EAX
5A55A9 0FA2             CPUID
5A55AB 0F31             RDTSC
5A55AD 0F6EC8           MOVD    MM1 , EAX
5A55B0 0F7EC3           MOVD    EBX , MM0
5A55B3 33C0             XOR     EAX , EAX
5A55B5 0FA2             CPUID
5A55B7 0F31             RDTSC
5A55B9 33C0             XOR     EAX , EAX
5A55BB 0FA2             CPUID   
5A55BD 0F31             RDTSC
5A55BF 0F6EC8           MOVD    MM1 , EAX
5A55C2 0F7EC3           MOVD    EBX , MM0
5A55C5 33C0             XOR     EAX , EAX
5A55C7 0FA2             CPUID
5A55C9 0F31             RDTSC
5A55CB 0F7EC9           MOVD    ECX , MM1
5A55CE 2BC1             SUB     EAX , ECX
5A55D0 8BD8             MOV     EBX , EAX
5A55D2 0F7ED0           MOVD    EAX , MM2
5A55D5 2BC3             SUB     EAX , EBX
5A55D7 E81C0DFBFF       CALL    5562F8  ( . )
5A55DC 8945FC           MOV     FC [EBP] , EAX
5A55DF 8B87581F0000     MOV     EAX , 1F58 [EDI]
5A55E5 8D6DFC           LEA     EBP , FC [EBP]
5A55E8 E8CBD8FAFF       CALL    552EB8  ( SP! )
5A55ED C3               RET     NEAR
END-CODE
( 195 Bytes )
Реальное время исполнения кода находится между значением его латентности и
временем исполнения кода, когда он полностью находится в кэше процессора.
У кода, который представляет собой цикл, латентность приближается к времени исполнения его из кэша.

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


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

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

chess писал(а):
WordByAddr

это для СПФ подходит. Тут АНС-овости нет.

chess писал(а):
нужна длина кода - дорабатываем SEE

SEE тоже не во всех фортах есть, да и это как бы "из пушек по воробьям" вроде.

ассемблерный вариант тоже не очень хорошая идея.
А вообще, для начала не плохо бы подумать, как оформлять тестируемый код...

какие критерии для тестирования выбрать?
какие более важные, а какие менее?
как можно автоматизировать тестирование результата?

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


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
необходим набор методик, позволяющих замерять автоматически:

скорость отдельных кусков кода,

длительность работы изучаемого алгоритма,

размер кода

проверять баланс стека

??? другие возможные параметры

Кажеться, только один вариант - моделировать форт-машину

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


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

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

А что делать-то, в ANSI такого понятия как время выполнения кода просто нет. :(
В единицах эквивалентных dup-drop это время измерять что-ли. :)
Насчет доработки SEE - это просто минимальная добавка текста к уже существующему исходнику.
Вывод же самого текста кода можно подавить.

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


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

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


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

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


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

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