среда, 4 апреля 2012 г.

Как определить время выполнения программы?

На олимпиадах все программы проверяются на специально подобранных тестовых заданиях, которые выполняются не более отведенного на это время исполнения программы на каждом тесте. Как в "домашних" условиях определить - сколько времени отработала ваша программа.

В TurboPascal была такая возможность - обратиться напрямую к памяти BIOS по адресу $0040:$006С (или $0000:$406C) и получить текущее время:

var t:longint absolute $40:$6c;
    v:longint;
...{глобальные переменные}
begin
   v:=t;{запомним начало времени выполнения программы}
...{основная часть программы}
   writeln('Время выполнения программы- ',t-v);
end.

Как же оно в памяти распознается? Само время представляет из себя 20 бит, в котором 5 бит отводится на часы, по 6 бит на минуты и секунды, и 4 бита на миллисекунды. Например, вы получили при выводе v число 1058411, в двоичной системе это будет число:
00000 00000 00010000 00100110 01111011
Получим 16 часов 9 минут 38 секунд 11*4 миллисекунды (на миллисекунды отводится всего 15 значений, т.е. 60/15=4 каждое значение умножим на 4).

Но вот во FreePascal такая программа выдает ошибку в первой строке. Переписав ее с использованием функции Ptr(адрес), ни к чему не привело. В интернете нашла лишь сообщение, что эта функция работает не правильно.

var t,v:longint;
begin
   t:=longint(ptr($40,$6c)^);
   v:=t; 
   writeln(v); {выдает ноль}

...{основная часть программы}

   t:=longint(ptr($40,$6c)^);
   writeln('Время выполнения программы- ',t-v);
end.

Поэтому вопрос остался открытым. Но можно воспользоваться функциями модуля DOS, но для отправки на проверку этот модуль нужно будет удалить, так как по правилам олимпиад по программированию использование сторонних библиотек запрещено, в том числе и модуля CRT.

uses dos;
var p:integer;
    h,m,s,g:word;
...{глобальные переменные}

begin
 GetTime(h,m,s,g);
 writeln(h,':',m,':',s,':',g);
 p:=g+60*(s+60*(m+60*h));

... {основная часть программы}
 GetTime(h,m,s,g);
 p:=(g+60*(s+60*(m+60*h)))-p;
 writeln(h,':',m,':',s,':',g);
 writeln('Время выполнения программы- ',p); 
end.

Комментариев нет:

Отправить комментарий