Автор |
Тема: Таймер (Прочитано 30571 раз) |
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
При отладке отчетных форм частo требуется измерить время, потребное на выполнение того или иного фрагмента кода или всей формы целиком. Имеющаяся встроенная функция [tm] мало для этого пригодна, так как выдает время с точностью до минуты. Пришлось "изобрести" свой таймер, а, точнее, приспособить решение, изложенное в руководстве. Вот две ПП: :TIMER (TM) local F F = [dir 0]+'timer.fil' создаем произвольный файл [:INITFILE F] ПП [ : INITFILE] описана в другой веточке см ниже loaddir F считываем парамерты этого файла T = [ged 'ldt.1'] время модификации этого файла return (T) * :TIMEDCD (T) декодирование временного интервала T=T1-T0 local se, tp, ho, mi, da, mo, ye * Accuracy 2 sec se =(T % 32)*2 sec T = [tr T/32]; mi = t % 64 minutes T = [tr T/64]; ho = t % 32 hours T = [tr T/32]; da = t % 32 day T = [tr T/32]; mo = t % 16 month ye= T/16 T = [:STRING ye]+'.'+[:STRING mo]+'.'+[:STRING da]+' '+[:STRING ho]+':'+[:STRING mi]+':'+[:STRING se] return (T) * Это решение обеспечивает измерение интервалов времени с точносттью до 2 секунд. ПП [ : INITFILE] описана в веточке http://hdru.com/cgi-bin/pp2/YaBB.cgi?board=news;action=display;num=14819 25556
|
« Изменён в : 28.12.16 в 20:17:28 пользователем: Vladimir » |
Зарегистрирован |
С уважением, Владимир
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
Интересный вариант с системным штампом создания файла. Но всё-таки, в чём преимущество такого подхода перед стандартным [sf 0,99]? Когда-то, помнится, для каких-то замеров, я даже "шарлатанствовал" и псевдо-доли секунд из концовки [sf 0,9] к результату добавлял
|
|
Зарегистрирован |
|
|
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
on 28.12.16 в 22:27:01, mine-R wrote: Но всё-таки, в чём преимущество такого подхода перед стандартным [sf 0,99]? |
| Честно я просто забыл о существовании [sf 0,99] Поэтому пришлось напрячься. Однако, получилось, по-моему, не плохо. В моем варианте удобно считать именно интервалы времени, так как [:TIMER] выдает числовые величины и их можно просто вычитать. Разность преобразуется [:TIMEDCD] в читабельнуб строку.
|
« Изменён в : 28.12.16 в 22:53:43 пользователем: Vladimir » |
Зарегистрирован |
С уважением, Владимир
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
on 28.12.16 в 20:14:20, Vladimir wrote:При отладке отчетных форм частo требуется измерить время, потребное на выполнение того или иного фрагмента кода или всей формы целиком. |
| Возможно, что Вы забыли не только о [sf 0,99], но и о том, что "Начиная с веpсии 3.03 в Сеpвеp встpоен Пpофилеp, пpедназначенный для поиска "узких" мест в пpиложениях ФБП. " Также замечу, что ваши доморощенные способы хронометража гораздо дальше от истины, т.к. профилер Аркадия зрит в корень расхода времени rpt-кода. Рекомендую внимательно ещё раз прочитать руководство и больше не забывать про уникальную и кучерявую *{{{ особенность нашей платформы.
|
|
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
on 28.12.16 в 22:27:01, mine-R wrote:Когда-то, помнится, для каких-то замеров, я даже "шарлатанствовал" и псевдо-доли секунд из концовки [sf 0,9] к результату добавлял |
| Собственно сабж. Нашёл-таки я этот шарлатанский алгоритм, датированный началом "нулевых" годов. Сам по себе код достаточно тривиальный, а вот некоторые пояснения, которые имел привычку делать "для себя в будущем", спустя время изрядно доставили *** Начало замера TIMESTART - TS TS=[strip[sf 0,99]] *** Начало замера долей секунд - DS DS=[sf 0,9] *** Допустим, что если строка короче 17 симв. дополнять нужно нулями ( !!? ) DS=[strip DS]+'00' *** Для разницы долей на случай если алгоритм будет работать дольше часа ( !!! А вот это просто расплющило ) DS=[CP DS,11,7] *** Доля секунды начала замера NS=[intsn[ce [vl DS]/100]] *** Полный результат начала замера TS=TS+':'+NS+[ch 13] *** Выводим Начало замера: printstr TS *** *** ДЛЯ ВСТАВКИ ИЗМЕРЯЕМОГО ФРАГМЕНТА КОДА for i=0 to 100000 endfor ( добавил пару нулей к кол-ву итераций, чтобы "алгоритм" хоть что-то замерил ) *** *** Конец замера TIMEEND - TE TE=[strip[sf 0,99]] *** Конец замера долей секунд - DE DE=[sf 0,9] *** Дополняем нулями DE=[strip DE]+'00' *** Для разницы долей DE=[CP DE,11,7] *** Доля секунды конца замера NE=[intsn[ce [vl DE]/100]] *** Полный результат конца замера TE=TE+':'+NE+[ch 13] *** Выводим Конец замера: printstr TE *** Вычисляем разницу долей секунд RD=[intsn[ce ([vl DE]/100-[vl DS]/100)]] Разница в долях: printstr RD on 29.12.16 в 08:37:29, Boris, Kiev. wrote:..."Начиная с веpсии 3.03 в Сеpвеp встpоен Пpофилеp, пpедназначенный для поиска "узких" мест в пpиложениях ФБП. "... |
| Полностью соглашусь, что при отладке, Профилер - незаменимый инструмент, однако представьте гипотетическую ситуацию : Из 1500 строк алгоритма, две третьих строк сами по себе не набирают нужного для замера количества тиков процессора, но суммируясь вместе, эти две третьих всё же становятся фактором (хотя, конечно же, не определяющим). Считаю, что так называемые "доморощенные" алгоритмы, зачастую бывают также очень полезны. Мне несколько раз точно приходилось возвращаться к "бесполезным" наработкам, чтобы извлечь полезные фрагменты кода.
|
« Изменён в : 30.12.16 в 00:32:07 пользователем: mine-R » |
Зарегистрирован |
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
on 29.12.16 в 23:54:10, mine-R wrote: Полностью соглашусь, что при отладке, Профилер - незаменимый инструмент, однако представьте гипотетическую ситуацию : Из 1500 строк алгоритма, две третьих строк сами по себе не набирают нужного для замера количества тиков процессора, но суммируясь вместе, эти две третьих всё же становятся фактором (хотя, конечно же, не определяющим). Считаю, что так называемые "доморощенные" алгоритмы, зачастую бывают также очень полезны. Мне несколько раз точно приходилось возвращаться к "бесполезным" наработкам, чтобы извлечь полезные фрагменты кода. |
| Не уловил, вернее потерял вашу нить размышлений. Может быть, Вы этого: Пpофилеp может также измеpить, сколько вpемени Сеpвеp занимался выполнением области, выделенной пользователем в любом rpt-файле. Начало области обозначается таким специальным комментарием: *{{{, а ее конец - таким: *}}} недочитали и недопробовали?
|
|
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
on 30.12.16 в 16:11:33, Boris, Kiev. wrote: Не уловил, вернее потерял вашу нить размышлений. Может быть, Вы этого: Пpофилеp может также измеpить, сколько вpемени Сеpвеp занимался выполнением области, выделенной пользователем в любом rpt-файле. Начало области обозначается таким специальным комментарием: *{{{, а ее конец - таким: *}}} недочитали и недопробовали? |
| Постоянно использую при отладке Профилер в разных вариациях. Красной нитью - наверное вопрос лени Или же я неверно использую эти измерительные комментарии. Иногда приходится либо много таких фрагментов выделять, либо выделять один, но затем производить арифметические операции над результатом. Что же касается "алгоритма"... Был заказ на вывод в отчёты графы "Время автоматизированной обработки", причем иногда последовательно для всех подразделений. Наверное и сегодня решал бы такую задачу подобным алгоритмом. Изъянов в алгоритме, конечно, было бы чуть меньше
|
|
Зарегистрирован |
|
|
|
Vladimir
Я люблю этот Форум!
Просмотреть Профиль | WWW |
Сообщений: 264
|
Покуда я работал на работе и горячие предновогодние деньки не давали мне возможности ответить, коллеги уже сами на все ответили, осталось подытожить. А итог такой: "У всех свои недостатки" (с). Конечно профилер - блестящий инструмет, но до того момента, пока вы не начали использовать ПП. Понятно, без них - ни куда, поэтому то и были изобретены *{{{ *}}}. Но эти змечательные скобочки - только одни. Если вы их повторите несколько раз, то получите суммарный результат (иногда это может оказаться удобным) и ни чего не поймете. Если забудете сбросить счетчик профиля %- то получите накопленный результат, и опять ни чего не поймете и придется перезапускать длительно работающую форму еще раз. Кроме того, удобно (и иногда - это требование начальства!) видеть время выполнения фрагментов кода как раз в в результате работы формы а не по команде % мысленно сопостовляя время выполнения и обскобленный код. Функция [tm] не решает эти проблемы, так как ее точность 1 минута. Функция [sf 0,99] решает эти проблемы, но выдает строку времени в формате не удобном для вычисления интервалов. Кроме того, разрешающая возможность функции [sf 0,99] - 1 сек. но об этом далее. А вот таймер основанный на loaddir как раз дает возможность легко считать интервалы времени, как например: T0 = [:TIMER] ...код... S = [:TIMEDCD [:TIMER] - T0] Потребовалось ^^^^^S^^^^^^ времени. Однако его разрешающая способность даже чуть хуже, чем у [sf 0,99], а именно 2 сек., что делает проблематичным накопление времени выполнения зацикленных фрагментов кода, как например: TS = 0 накопитель времени for i=1 to 1000 T0 = [:TIMER] ...код выполняющийся 1~1.5 сек TS = TS + [:TIMER] - T0 enfor В этом случае, по завершению цикла, TS запросто может оказаться нулем вместо 1500 секунд. Но, не смотря на недосток, идея имеет право на существование. Надо только пользоваться правильно. Пользутесь на здоровье.
|
« Изменён в : 02.01.17 в 02:13:04 пользователем: Vladimir » |
Зарегистрирован |
С уважением, Владимир
|
|
|
|
|