OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 21 Август, 2019 21:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Понедельник, 23 Октябрь, 2017 18:39 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Я хочу сравнить различные алгоритмы сортировки по времени выполнения, а затем построить график. Но как узнать время выполнения процедуры?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 23 Октябрь, 2017 19:15 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1381
Александр К писал(а):
Я хочу сравнить различные алгоритмы сортировки по времени выполнения, а затем построить график. Но как узнать время выполнения процедуры?

Если в винде - смотри описание функций QueryPerformanceFrequency и QueryPerformanceCounter.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 23 Октябрь, 2017 22:25 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Чем не подходит для этой задачи Dev, Timed execute?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 23 Октябрь, 2017 22:49 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1199
Код:
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 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Время, затраченное на сторонние процессы, тоже будет учитываться?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 24 Октябрь, 2017 14:31 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2354
Александр К писал(а):
Время, затраченное на сторонние процессы, тоже будет учитываться?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 24 Октябрь, 2017 15:37 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Такая вещь, как DevProfiler.Execute тоже учитывает время сторонних процессов? И почему-то эта процедура у меня постоянно выдаёт 0. :(


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 24 Октябрь, 2017 18:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9131
Откуда: Россия, Орёл
Значит, слишком быстро, чтобы замерить.

Поставьте на саму процедуру цикл, например, 1000 раз вызова.
Тогда это станет измеримо.

(Альтернатива, когда так нельзя сделать - а нельзя тогда, когда нужно мерять малые отрезки, проходимые многократно, - это как выше назвал Wlad, функции более точного измерения в микросекундах).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 24 Октябрь, 2017 23:20 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1381
Александр К писал(а):
Такая вещь, как DevProfiler.Execute тоже учитывает время сторонних процессов? И почему-то эта процедура у меня постоянно выдаёт 0. :(

Я вам уже указал самый оптимальный путь под виндой.
Там считаются тики процессора (ну, не совсем самого процессора, но - достаточно частый и точный пересчёт).
Точность будет - до примерно (насколько я помню) одной трёх-с-половиной-миллионной секунды (если стандартный счётчик "тиков"). Одна функция выдаёт частоту пересчёта тиков, вторая - текущее значение "тиков", с момента последнего аппаратного сброса микропроцессора. Нужную точность промежутка посчитанного интервала времени - подбираете сами множителями/делителями.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 25 Октябрь, 2017 19:32 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Wlad писал(а):
Если в винде - смотри описание функций QueryPerformanceFrequency и QueryPerformanceCounter.

Где именно смотреть? В каком-то модуле?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 25 Октябрь, 2017 22:45 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1381
Александр К писал(а):
Wlad писал(а):
Если в винде - смотри описание функций QueryPerformanceFrequency и QueryPerformanceCounter.

Где именно смотреть? В каком-то модуле?

Для начала пойдите на страницы MSDN и найдите описание этих функций там (ну, или - в справочнике каком-нить...)
Потом, посмотрите, как оформляются заголовки процедур и функций из системных виндовых dll-ек в "интерфейсных" модулях КП (подробности - в Help-->Contents-->Miscellaneous-->Platform-Specific Issues (Windows)) . И, наконец - вызывайте их. Примеры использования - в MSDN.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 25 Октябрь, 2017 23:28 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1199
Для сравнения алгоритмов сортировки лишнее это.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 26 Октябрь, 2017 08:41 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2354
Илья Ермаков писал(а):
Значит, слишком быстро, чтобы замерить.

Поставьте на саму процедуру цикл, например, 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 сейчас.


Последний раз редактировалось Иван Денисов Четверг, 26 Октябрь, 2017 09:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 26 Октябрь, 2017 09:25 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 714
Откуда: Барнаул
QueryThreadCycleTime


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 26 Октябрь, 2017 10:22 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1199
Код:
PROCEDURE [code] RDTSC(): LONGINT 0FH, 31H;

PROCEDURE CPUTikcs* (): LONGINT;
BEGIN
   RETURN RDTSC()
END CPUTikcs;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 26 Октябрь, 2017 12:50 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1381
Trurl писал(а):
Код:
PROCEDURE [code] RDTSC(): LONGINT 0FH, 31H;

PROCEDURE CPUTikcs* (): LONGINT;
BEGIN
   RETURN RDTSC()
END CPUTikcs;
Объясните для долго отсутствовавшего, можно ли без промежуточной функции CPUTicks обойтись?
Или там что-то с разнящимися ABI?
Или - нельзя [сode]-функцию видимой вне модуля делать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 26 Октябрь, 2017 15:19 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1199
Можно и обойтись, конечно. Привычка просто.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Октябрь, 2017 10:11 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Иван Денисов писал(а):
Не связывайтесь с MSDN сейчас.

Почему?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Октябрь, 2017 11:09 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Написал я програмку:
Код:
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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2354
Александр К писал(а):
Иван Денисов писал(а):
Не связывайтесь с MSDN сейчас.

Почему?

Вся прелесть работы с фреймворком в том, что вы абстрагируетесь от API операционной системы, которая устроена весьма несовершенным образом. Везде, где вы можете не использовать WInApi, я бы порекомендовал его не использовать. Есть задачи, где без этого не обойтись, но смысла новичку копаться в MSDN не вижу.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB