OberonCore https://forum.oberoncore.ru/ |
|
Как узнать, сколько времени выполняется процедура? https://forum.oberoncore.ru/viewtopic.php?f=35&t=6146 |
Страница 1 из 2 |
Автор: | Александр К [ Понедельник, 23 Октябрь, 2017 18:39 ] |
Заголовок сообщения: | Как узнать, сколько времени выполняется процедура? |
Я хочу сравнить различные алгоритмы сортировки по времени выполнения, а затем построить график. Но как узнать время выполнения процедуры? |
Автор: | Wlad [ Понедельник, 23 Октябрь, 2017 19:15 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Александр К писал(а): Я хочу сравнить различные алгоритмы сортировки по времени выполнения, а затем построить график. Но как узнать время выполнения процедуры? Если в винде - смотри описание функций QueryPerformanceFrequency и QueryPerformanceCounter. |
Автор: | Info21 [ Понедельник, 23 Октябрь, 2017 22:25 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Чем не подходит для этой задачи Dev, Timed execute? |
Автор: | Trurl [ Понедельник, 23 Октябрь, 2017 22:49 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Код: PROCEDURE Do*(N:INTEGER);
VAR starttime, endtime:LONGINT; BEGIN starttime := Kernel.Time(); solve(N); endtime := Kernel.Time(); Log.Real((endtime-starttime)/1000);Log.Ln; END Do; |
Автор: | Александр К [ Вторник, 24 Октябрь, 2017 13:28 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Время, затраченное на сторонние процессы, тоже будет учитываться? |
Автор: | Иван Денисов [ Вторник, 24 Октябрь, 2017 14:31 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Александр К писал(а): Время, затраченное на сторонние процессы, тоже будет учитываться? На сколько мне известно, да. Поэтому необходимо проводить несколько замеров, убирать из результатов числа с явным отклонением от среднего и потом вычислять среднее значение. На деле оказывается, что трех-четырех измерений достаточно для приблизительной оценки. |
Автор: | Александр К [ Вторник, 24 Октябрь, 2017 15:37 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Такая вещь, как DevProfiler.Execute тоже учитывает время сторонних процессов? И почему-то эта процедура у меня постоянно выдаёт 0. |
Автор: | Илья Ермаков [ Вторник, 24 Октябрь, 2017 18:27 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Значит, слишком быстро, чтобы замерить. Поставьте на саму процедуру цикл, например, 1000 раз вызова. Тогда это станет измеримо. (Альтернатива, когда так нельзя сделать - а нельзя тогда, когда нужно мерять малые отрезки, проходимые многократно, - это как выше назвал Wlad, функции более точного измерения в микросекундах). |
Автор: | Wlad [ Вторник, 24 Октябрь, 2017 23:20 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Александр К писал(а): Такая вещь, как DevProfiler.Execute тоже учитывает время сторонних процессов? И почему-то эта процедура у меня постоянно выдаёт 0. Я вам уже указал самый оптимальный путь под виндой. Там считаются тики процессора (ну, не совсем самого процессора, но - достаточно частый и точный пересчёт). Точность будет - до примерно (насколько я помню) одной трёх-с-половиной-миллионной секунды (если стандартный счётчик "тиков"). Одна функция выдаёт частоту пересчёта тиков, вторая - текущее значение "тиков", с момента последнего аппаратного сброса микропроцессора. Нужную точность промежутка посчитанного интервала времени - подбираете сами множителями/делителями. |
Автор: | Александр К [ Среда, 25 Октябрь, 2017 19:32 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Wlad писал(а): Если в винде - смотри описание функций QueryPerformanceFrequency и QueryPerformanceCounter. Где именно смотреть? В каком-то модуле? |
Автор: | Wlad [ Среда, 25 Октябрь, 2017 22:45 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Александр К писал(а): Wlad писал(а): Если в винде - смотри описание функций QueryPerformanceFrequency и QueryPerformanceCounter. Где именно смотреть? В каком-то модуле? Для начала пойдите на страницы MSDN и найдите описание этих функций там (ну, или - в справочнике каком-нить...) Потом, посмотрите, как оформляются заголовки процедур и функций из системных виндовых dll-ек в "интерфейсных" модулях КП (подробности - в Help-->Contents-->Miscellaneous-->Platform-Specific Issues (Windows)) . И, наконец - вызывайте их. Примеры использования - в MSDN. |
Автор: | Trurl [ Среда, 25 Октябрь, 2017 23:28 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Для сравнения алгоритмов сортировки лишнее это. |
Автор: | Иван Денисов [ Четверг, 26 Октябрь, 2017 08:41 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Илья Ермаков писал(а): Значит, слишком быстро, чтобы замерить. Поставьте на саму процедуру цикл, например, 1000 раз вызова. Тогда это станет измеримо. Илья дело говорит. Так и статистика по 1000 измерениям получится. Код: PROCEDURE Do*(N:INTEGER); VAR starttime, endtime:LONGINT; i: INTEGER; BEGIN starttime := Kernel.Time(); FOR i := 1 TO 1000 DO solve(N) END; endtime := Kernel.Time(); Log.Real((endtime-starttime)/1000); Log.Ln; END Do; Не связывайтесь с MSDN сейчас. |
Автор: | Kemet [ Четверг, 26 Октябрь, 2017 09:25 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
QueryThreadCycleTime |
Автор: | Trurl [ Четверг, 26 Октябрь, 2017 10:22 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Код: PROCEDURE [code] RDTSC(): LONGINT 0FH, 31H;
PROCEDURE CPUTikcs* (): LONGINT; BEGIN RETURN RDTSC() END CPUTikcs; |
Автор: | Wlad [ Четверг, 26 Октябрь, 2017 12:50 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Trurl писал(а): Код: PROCEDURE [code] RDTSC(): LONGINT 0FH, 31H; PROCEDURE CPUTikcs* (): LONGINT; BEGIN RETURN RDTSC() END CPUTikcs; Или там что-то с разнящимися ABI? Или - нельзя [сode]-функцию видимой вне модуля делать? |
Автор: | Trurl [ Четверг, 26 Октябрь, 2017 15:19 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Можно и обойтись, конечно. Привычка просто. |
Автор: | Александр К [ Воскресенье, 29 Октябрь, 2017 10:11 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Иван Денисов писал(а): Не связывайтесь с MSDN сейчас. Почему? |
Автор: | Александр К [ Воскресенье, 29 Октябрь, 2017 11:09 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Написал я програмку: Код: MODULE MyTime ["Kernel32.dll"]; PROCEDURE QueryPerformanceCounter* (): LONGINT; END MyTime. Код: MODULE Time;(*Использование системного счётчика QPC*) IMPORT StdLog, MyTime; PROCEDURE Do*; VAR StatrTimer, EndTimer, Time: LONGINT; i: INTEGER; BEGIN i := 0; StatrTimer := MyTime.QueryPerformanceCounter(); REPEAT INC(i) UNTIL i = 10000; EndTimer := MyTime.QueryPerformanceCounter(); StdLog.String ("Выполнилось за "); Time := EndTimer - StatrTimer; StdLog.Int (Time) END Do; END Time. Отлично компилируется, запускается... Но после этого ВВ перестаёт работать: нельзя открывать файлы, сохранять - вообще меню не действует. |
Автор: | Иван Денисов [ Воскресенье, 29 Октябрь, 2017 11:10 ] |
Заголовок сообщения: | Re: Как узнать, сколько времени выполняется процедура? |
Александр К писал(а): Иван Денисов писал(а): Не связывайтесь с MSDN сейчас. Почему? Вся прелесть работы с фреймворком в том, что вы абстрагируетесь от API операционной системы, которая устроена весьма несовершенным образом. Везде, где вы можете не использовать WInApi, я бы порекомендовал его не использовать. Есть задачи, где без этого не обойтись, но смысла новичку копаться в MSDN не вижу. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |