Технічна документація

Часто при програмуванні в деяких місцях програми необхідно заміряти час виконання коду, в інших просто зупиняти виконання не кілька днів. Наприклад, якщо писати гру, необхідно створювати код, який би обмежував швидкість гри. Звичайно, якщо гра дуже тяжелоя, то деякий час вона може існувати без такого обмежувача. Але з часом обчислювальна потужність комп'ютерів зростає (нажаль не сама по собі) і в ігри без обмежувача швидкості грати стає неможливо. Або ви вирішили написати бенчмарк для процесора. Тут вже потрібні дуже точні засоби для виміру часу виконання коду. Таких прикладів можна навести безліч. Простіше сказати, що в будь-який більш - міння серезно програмі вимір часу просто необхідно. На жаль штатні засоби в Паскалі обмежуються тільки процедурою Delay що описана в модулі CRT. Але вона дуже сильно залежить від продуктивності системи. Звичайно, можна використовувати процедуру GetTime, але вона досить громіздка. А стандартних процедур по виміру часу виконання коду вобще немає.

Ну і не треба! Адже ми не чайники? Звичайно, не чайники! Самі напишемо. При написанні програм послідовний код намагаються об'єднатися в цикл. Код, що повторюється в програмі виносять в окремі процедури і функції. А код, який явно буде використовуватися не в одній програмі, виносять в модулі. Ми так і зробимо. Давайте створимо в Паскалі файл TIMER.PAS і почнемо. Як відомо назву модуля і файлу повинні збігатися, поетому пишемо:

Далі необхідно створити інтерфейсну частину модуля. Тут давайте зупинимося і розберемося що нам потрібно. По-перше нам потрібні кошти для вимірювання часу виконання коду. По-друге кошти по зупинці програми на певний час. Крім того, при зупинці може, знадобиться висновок часу, який минув.

interface
procedure Start (var T: longint);
procedure Stop (var T: longint);
procedure Pause (T: longint; Show: boolean);

Отже, ми обявил три процедури. Процедури Start і Stop будуть служити для виміру часу виконання коду, а Pause стане заміною Delay. Мінлива T - будить служити для передачі даних про час. Show - для дозволу або заборони виведення часу на екран. Далі слід виконавча частина. Вона служить для Об'яви локальних констант, змінних і типів. В даному модулі вони нам не потрібні:

Далі слід найцікавіше. Ви ще не замислювалися яким же способом ми будемо виробляти завмер часу? А чому б не іспользаванной апаратний таймер? Темболее це дуже просто:

SystemTimer: longint absolute $ 0040: $ 006C;

procedure Start (var T: longint);
begin
T: = SystemTimer;
end;
procedure Stop (var T: longint);
begin
T: = SystemTimer-T;
end;

procedure Pause (T: longint; Show: boolean);
var Xn, Xt: longint;
begin
Xt: = 0;
Xn: = SystemTimer;
While ((Xt-Xn) /18.2) * 1000 begin
Xt: = SystemTimer;
If Show then
writeln ((xt-xn) /18.2:6:4)
end;
end;

Ну, і довгоочікуваний

Все, компілюємо. Хочеться відразу перевірити роботу, чи не так?

Program TimerPrimer;
uses timer;
Var i. integer;
a: Real;
Time. LongInt;
begin
Randomize;
Start (Time);
For i: = 1 to 30000 do
a: = Sin (sqrt (i)) * Cos (sqrt (Random (10000)));
Stop (Time);
Writeln ( 'Час виконання:', Time / 18.2: 6: 4);
Readln;
Pause (10000, True);
end.

Дана програма демонструє можливості модутя Timer. На початку вона виконує цикл від 1 до 30000 в якому вираховує значення а. Час виконання цього циклу і заміряють наші процедури Start і Stop. Після чого, дочекавшись натискання на Enter робимо паузу на 10.000 секунд з дозволяємо процедурі Pause здійснювати вивід на екран.

Схожі статті