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;
Объясните для долго отсутствовавшего, можно ли без промежуточной функции CPUTicks обойтись?
Или там что-то с разнящимися 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/