Forth http://fforum.winglion.ru/ |
|
*замер скорости выполнения алгоритма http://fforum.winglion.ru/viewtopic.php?f=19&t=1270 |
Страница 1 из 1 |
Автор: | mOleg [ Пн апр 28, 2008 22:15 ] |
Заголовок сообщения: | *замер скорости выполнения алгоритма |
всвязи с необходимостью нахождения некой оценки решений заданий на конкурсе, возникла следующая практическая задача: необходим набор методик, позволяющих замерять автоматически:
Общий вид решения обсуждаем (предлагайте интерфейс, синтаксис, решение). Решение победителя будет использоваться в дальнейшем ;) |
Автор: | Pretorian [ Вт апр 29, 2008 05:53 ] |
Заголовок сообщения: | |
А вот это дельная тема, может тогда все задачи на конкурс выставлять для развития нужных вещей в форте. |
Автор: | вопрос [ Вт апр 29, 2008 11:30 ] |
Заголовок сообщения: | |
переписать компилатор с автоматическим добавлением измерителей к каждому слову ... А что имеется ввиду (для не самых понятливых)? То, что я могу предлоить в меру понимания, это не более чем "копия" известных мне дибаггеров Для целей испытания каждое слово компилируется так, что - если в системе присутствует значение 1 у переменной "DEBUG", И если слово вызвано отдельно - происходит переход на такой код, в который включены куски измерителей - если в системе нулевое значение переменной "DEBUG", ИЛИ если слово вызвано из другого слова (как часть кода) - переход на обычный код - значение 2 у переменной даст вызов слова с измерением независимо от того, вызвано оно само по себе или в рамках другого слова Также может быть полезно организовать слово "многократный вызов" , где вызов каждого слова осуществлялся многократно с восстановлением стека перед вызовом или\и участка памяти ИМХО, разумеется Я всё таки пока слабо компетентен в Форте Там, где я что-то тестирую, у меня почти всегда есть функция, формирующая рапорт о результате в удобоваримом виде |
Автор: | AlexF [ Вт апр 29, 2008 12:34 ] |
Заголовок сообщения: | |
Для измерения скорости библиотека: Код: ~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 \ вывели статистику |
Автор: | mOleg [ Ср апр 30, 2008 23:28 ] |
Заголовок сообщения: | |
Pretorian писал(а): переписать компилатор с автоматическим добавлением измерителей к каждому слову ... я не понял, откуда вы взяли цитату. Компилятор переписывать ни в коем случае не надо! Надо наиболее портируемое решение, позволяющее на любом(в идеале) форте запускать указанные слова. вопрос писал(а): То, что я могу предлоить в меру понимания, это не более чем "копия" известных мне дибаггеров дебаггер, он совсем не в ту тему. Нужно не дебагить, а замерять время исполнения кода, каким образом - это уже второй момент. Еще раз, не нужно мерить время работы каждого слова в задаче (для этого профайлер есть). Надо мерить только время работы указанного куска кода. Вопрос в лучшем синтаксическом окружении, и простейшем, но гарантированно и точно работающей методики. AlexF писал(а): Для измерения скорости библиотека: Код:~pinka/lib/tools/profiler.f не, не подойдет? Думаю, очень хороший вариант.
уже обсуждалось - там есть косяки. Меряет не всегда адекватно, и не совсем применим для нас. Размер кода тоже не замеряется. |
Автор: | Pretorian [ Вс май 04, 2008 07:46 ] |
Заголовок сообщения: | |
mOleg писал(а): Pretorian писал(а): переписать компилатор с автоматическим добавлением измерителей к каждому слову ... я не понял, откуда вы взяли цитату. Компилятор переписывать ни в коем случае не надо! Надо наиболее портируемое решение, позволяющее на любом(в идеале) форте запускать указанные слова. ЭЭЭ, а что я сразу, я про "переписать компилятор" не говорил. Акуратней господа, свои слова за чужие не выдавайте. |
Автор: | WingLion [ Вс май 04, 2008 08:47 ] |
Заголовок сообщения: | |
Спокойно! Такая ошибка в цитировании возникает при использовании фичи "цитировать выделеное", если выделить текст в одном посте, а ссылку по ошибке нажать под именем другого юзера. |
Автор: | chess [ Пн май 05, 2008 18:46 ] |
Заголовок сообщения: | |
для измерения времени кода Код: 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 ] |
Заголовок сообщения: | |
Ассемблерный вариант измерителя времени кода. Код: 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 ) временем исполнения кода, когда он полностью находится в кэше процессора. У кода, который представляет собой цикл, латентность приближается к времени исполнения его из кэша. |
Автор: | mOleg [ Сб май 10, 2008 18:29 ] |
Заголовок сообщения: | |
chess писал(а): для измерения времени кода chess писал(а): WordByAddr это для СПФ подходит. Тут АНС-овости нет. chess писал(а): нужна длина кода - дорабатываем SEE
SEE тоже не во всех фортах есть, да и это как бы "из пушек по воробьям" вроде. ассемблерный вариант тоже не очень хорошая идея. А вообще, для начала не плохо бы подумать, как оформлять тестируемый код... какие критерии для тестирования выбрать? какие более важные, а какие менее? как можно автоматизировать тестирование результата? |
Автор: | вопрос [ Сб май 10, 2008 21:21 ] |
Заголовок сообщения: | |
Цитата: необходим набор методик, позволяющих замерять автоматически:
скорость отдельных кусков кода, длительность работы изучаемого алгоритма, размер кода проверять баланс стека ??? другие возможные параметры Кажеться, только один вариант - моделировать форт-машину |
Автор: | chess [ Пн май 12, 2008 07:59 ] |
Заголовок сообщения: | |
вопрос писал(а): ассемблерный вариант тоже не очень хорошая идея.
А что делать-то, в ANSI такого понятия как время выполнения кода просто нет. В единицах эквивалентных dup-drop это время измерять что-ли. Насчет доработки SEE - это просто минимальная добавка текста к уже существующему исходнику. Вывод же самого текста кода можно подавить. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |