Unit TIMER;
Interface
Implementation
Begin
writeln( ‘Считает время работы программы’ );
End .
Uses timer.pas;
unit timer;
interface
Procedure get_time_start;
Procedure get_time_stop;
Procedure put_time;
implementation
Uses dos;
Var
hour_start : word;
min_start : word;
sec_start : word;
hund_start : word;
hour_stop : word;
min_stop : word;
sec_stop : word;
hund_stop : word;
hour : word;
min : word;
sec : word;
hund : word;
Procedure get_time_start;
Begin
gettime(hour_start, min_start, sec_start, hund_start);
End ;
Procedure get_time_stop;
Begin
gettime (hour_stop, min_stop, sec_stop, hund_stop);
End ;
Procedure put_time;
Procedure format (hour, min, sec, hund : word);
Procedure print (w : word);
Begin
If w hour_start Then
Begin
dec(hour_stop);
inc(min_stop, 60);
End ;
If min_stop > min_start Then
Begin
dec(min_stop);
inc(sec_stop, 60);
End ;
If sec_stop > sec_start Then
Begin
dec(sec_stop);
inc(hund_stop, 60);
End ;
hour := hour_stop — hour_start;
hour := min_stop — min_start;
hour := sec_stop — sec_start;
hour := hund_stop — hund_start;
If hund > = 100 Then
Begin
dec(hund, 100);
inc(sec);
End ;
If sec > = 60 Then
Begin
dec(sec, 60);
inc(min);
End ;
If min > = 60 Then
Begin
dec(min, 60);
inc(hour);
End ;
End ;
Begin
write ( ‘Момент остановки: ‘ );
format (hour_stop, min_stop, sec_stop, hund_stop);
write ( ‘Момент начала работы: ‘ );
format (hour_start, min_start, sec_start, hund_start);
compute_elapsed_time;
write ( ‘Затраченное время’ );
format (hour, min, sec, hund);
End ;
Begin
End .
Источник: borland.ru
Олимпиады по программированию
Этот блог посвящен вопросам подготовки к олимпиадам по программированию и самой технологии программирования. Используемый язык программирования предпочитаю Паскаль. С некоторых пор стала подробнее изучать Си, так что теперь могу поделиться примерами и на Си. Не все мне известно, но то, что знаю — делюсь с Вами.
Страницы
- Главная страница
- Задачи с олимпиад
- Разбор заданий из ЕГЭ
- Разбор задач с олимпиад
Поиск по этому блогу
среда, 4 апреля 2012 г.
Как определить время выполнения программы?
На олимпиадах все программы проверяются на специально подобранных тестовых заданиях, которые выполняются не более отведенного на это время исполнения программы на каждом тесте. Как в «домашних» условиях определить — сколько времени отработала ваша программа.
В TurboPascal была такая возможность — обратиться напрямую к памяти BIOS по адресу $0040:$006С (или $0000:$406C) и получить текущее время:
var t:longint absolute $40:$6c;
writeln(‘Время выполнения программы- ‘,t-v);
Как же оно в памяти распознается? Само время представляет из себя 20 бит, в котором 5 бит отводится на часы , по 6 бит на минуты и секунды , и 4 бита на миллисекунды . Например, вы получили при выводе v число 1058411, в двоичной системе это будет число:
00000 00000 000 10000 001001 10 0111 1011
Получим 16 часов 9 минут 38 секунд 11*4 миллисекунды (на миллисекунды отводится всего 15 значений, т.е. 60/15=4 каждое значение умножим на 4).
Но вот во FreePascal такая программа выдает ошибку в первой строке. Переписав ее с использованием функции Ptr(адрес), ни к чему не привело. В интернете нашла лишь сообщение, что эта функция работает не правильно.
var t,v:longint;
t:=longint(ptr($40,$6c)^);
v:=t;
writeln(‘Время выполнения программы- ‘,t-v);
Поэтому вопрос остался открытым. Но можно воспользоваться функциями модуля DOS, но для отправки на проверку этот модуль нужно будет удалить, так как по правилам олимпиад по программированию использование сторонних библиотек запрещено, в том числе и модуля CRT.
var p:integer;
h,m,s,g:word;
GetTime(h,m,s,g);
p:=(g+60*(s+60*(m+60*h)))-p;
writeln(h,’:’,m,’:’,s,’:’,g);
writeln(‘Время выполнения программы- ‘,p);
Источник: olymp-programming.blogspot.com
Научный форум dxdy
Здравствуйте. Есть вопрос: как в Паскале узнать время, за которое выполнился алгоритм? Не могли бы подсказать? Вроде надо подпрограмму составлять?
И ещё, просветите новичка, пожалуйста: что такое трудоемкость алгоритма и как её узнать (в том же Паскале)?
Спасибо.
26.01.2009, 18:05
Дёрните gettime() два раза — до и после. И никаких подпрограмм.
26.01.2009, 18:47
Однако, ругается почему-то: Unknown identifier
26.01.2009, 18:58
Эта процедура — из юнита DOS, который надо подключить.
26.01.2009, 20:58
IvanUsach в сообщении #181457 писал(а):
что такое трудоемкость алгоритма и как её узнать (в том же Паскале)?
Трудоемкость алгоритма, это функция от размера входных данных,
описывающая необходимое для выполнения количество элементарных операций.
Например трудоемкость QuickSort

А элементарная операция здесь — перестановка
Трудоемкость алгоритма не зависит от того языка на котором вы его реализуете,
а подсчет трудоемкости задача в общем случае нетривиальная.
26.01.2009, 21:48
Можно «схалтурить» :
создать .bat-файл такого содержания:
time> time.txt
program.exe
time> time.txt
а потом брать разность времён. (только это эффективно для «долгих» программ-порядка 1 мин), впрочем не обращайте внимания.
26.01.2009, 21:59
не нужно халтурить. Упомянутая процедура (базирующаяся наверняка на стандартных прерываниях) задачу вполне решает. Надо только её подключить.
—————————————————————
(там, если мне не отшибает память — точность отсчёта порядка одной миллисекунды)
26.01.2009, 22:09
Может-некорректно, но всегда интересовало- ведь время вызова процедуры (или чего-то в этом роде) наверняка больше одной mls, смысл измерять с такой точностью?
26.01.2009, 22:30
почему больше? программа ведь компилируется, а время вызова любой процедуры (уже сидящей после компиляции в оперативной памяти) — ничтожно мало.
28.01.2009, 10:54
ewert писал(а):
а время вызова любой процедуры (уже сидящей после компиляции в оперативной памяти) — ничтожно мало.
Это и хотелось уточнить.
Добавлено спустя 1 минуту 27 секунд:
28.01.2009, 11:59
ewert писал(а):
почему больше? программа ведь компилируется, а время вызова любой процедуры (уже сидящей после компиляции в оперативной памяти) — ничтожно мало.
Строго говоря, время вызова одной процедуры ничтожно мало. Но тем не менее, определенные накладные расходы на этот вызов существуют, и если некоторая простая процедура вызывается из какого-нибудь глубокого внутреннего цикла очень много раз, то эти расходы могут стать вполне заметными, особенно если они сопоставимы с собственно временем работы самой процедуры. Перенос ее кода непосредственно в точку вызова может довольно ощутимо ускорить выполнение. Точные ответы на все эти вопросы может дать профилирование программы.
Добавлено спустя 3 минуты 14 секунд:
К тому же, результат примитивного измерения времени выполнения может быть неточным из-за загрузки процессора другими потоками, выполняемыми параллельно или в фоне, а также узкими местами, связанными с вводом-выводом данных на диск или на экран.
28.01.2009, 12:23
Параллельность потоков — это действительно проблема (для измерения), поскольку — внешняя по отношению к программе. А вот ввод-вывод сами по себе к делу не относятся.
Что касается многократных вызовов — тоже не по делу. Если мы, например, пытаемся оценить время работы самой процедуры, то существенно лишь, чтобы время вызова было много меньше времени исполнения. Т.е. чтобы тело процедуры было мало-мальски содержательным.
(я вообще-то по натуре не программист, но — опыт показывает)
28.01.2009, 14:21
Речь шла вроде о том, что мы оцениваем время работы программы, замеряя момент ее старта и завершения. Проблема заключается в том, что накладные расходы могут результат этого измерения исказить.
Допустим, что программа заключается в многократном выполнении тела некоторого цикла, причем одна итерация цикла занимает очень малое время. Какой-нибудь метод последовательных приближений. Количество итераций достаточно велико, так что общее время выполнения программы, скажем, измеряется в десятках секунд.
Для контроля того, как работает программа, можно, например, на каждой итерации выводить на экран номер этой итерации или же какую-нибудь дополнительную информацию. Последние несколько цифр номера итерации мелькают на экране очень быстро, но первые вполне видны. Мой опыт показывает, что на этом шаге если выводить данные не на каждой итерации, а, скажем, на каждой сотой или тысячной, то ускорение времени будет вполне заметным даже «на глаз». При том, что содержательная часть ровно такая же. Это пример накладных расходов от частого вывода на экран.
Аналогично могут быть накладные расходы от операций работы с диском. Могу привести пример из собственной практики. Необходимо было провести работу с некоторыми данными, которые были записаны в файлы. Файлы были небольшого размера и их было много. Программа работала реально медленно. Потом я склеил все данные в один огромный файл (размером в несколько гигабайт).
Разумеется, для работы с ним пришлось применять специальные функции ОС. Ускорение от этой процедуры было на один-два порядка. Причина — в накладных расходах, связанных с процедурами открытия-закрытия файла.
Еще один пример, который я также реально наблюдал, связан с кешем жесткого диска. Прочитанные данные хранятся в этом кеше и при повторном чтении грузятся гораздо быстрее. При этом программа, подобная предыдущей, при двух последовательных запусках работала существенно разное время.
С многократными вызовами простых и сравнительно бессодержательных процедур и необходимостью их оптимизации я также сталкивался.
Что же касается проблем измерения времени, связанных с паралеллизмом, то это, конечно, проблема, в том смысле, что это нельзя учесть средствами самой программы. Но операционная система при распределении процессорного времени между потоками аккуратно подсчитывает, кто сколько получал, и имеются специальные функции, которыми можно у ОС спросить, сколько реально процессорного времени было выделено заданному потоку. Так что это решено.
Все это я к тому лишь, что существует ряд технических деталей, которые могут повлиять на время выполнения программы и исказить картину, если задача стоит о практической оценке трудоемкости чистого алгоритма.
28.01.2009, 14:42
вот, кстати, я буквально в этот момент на коленке пытаюсь запрограммировать нечто теплопроводное. И как раз с целью определить трудоёмкость. Т.е. вопрос фактически таков: можно ли будет потом встроить эту программку в некий продукт так, чтоб он мог работать в режиме «реального времени» — или будет тормозить?
А поскольку коэффициент теплопроводности задан принципиально ступенчатым образом (область разбита на кирпичики) — его нахождение становится не вполне тривиальным. Поэтому я просто выделил итерацию на каждом узле в отдельную процедуру — обращение к ней в любом случае потребует много меньше времени, чем собственно работа.
Ну это к слову. А спросить хотелось вот о чём. У меня несколько дней назад почему-то перестались запускаться все ДОСовские приложения из-под ФАРа. (в т.ч. и сам ФАР — при попытке запустить его из-под себя как вторую копию). Система срывается — выводится сообщение, что ей там чего-то не в жилу и что через минуту перезагрузится.
Под Тотал Командером вроде работать можно, но — тоже с некоторыми заморочками.
Что бы это могло быть?
28.01.2009, 14:50
Еще раз выскажу мнение, что любой серьезный анализ производительности и поиск узких мест должен основываться на профилировании.
А второй вопрос — это в данной теме оффтопик. Можете задать его отдельной темой. Но в любом случае вряд ли можно на него содержательно ответить, если Вы не напишете, о какой ОС идет речь и как именно она ругается.
Страница 1 из 1 | [ Сообщений: 15 ] |
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей
Источник: dxdy.ru