1

Тема: Час виконання програми

Я порівнюю методи сортування масивів. Для цього потрібно дізнатися за який проміжок часу програма сортує масив. Шукала в гуглі та точної інформації таки не знайшла. Працюю на PascalABC. Наскільки я зрозуміла використовується модуль Utils та DateTime. Та не ясно мені як записати це в програмі. Як надати змінній значення часу?

2 Востаннє редагувалося koala (27.03.2014 21:15:36)

Re: Час виконання програми

Uses System; {бібліотека .NET для роботи з часом}

var startTime, endTime: DateTime; {час початку і закінчення}

begin 
  startTime := DateTime.Now; {запам'ятовуємо час початку}
  {наша програма}
  endTime := DateTime.Now; {запам'ятовуємо час закінчення}
  writeln( ( endTime - startTime ).Milliseconds ) {виводимо різницю в мілісекундах}
end.
Подякували: studentKA1

3

Re: Час виконання програми

Невідоме ім'я типу DateTime.
Що значить "бібліотека .NET"? Мені треба щось докачати?

4

Re: Час виконання програми

У вас яка версія PascalABC? Це ще не PascalABC.NET?

5 Востаннє редагувалося koala (27.03.2014 21:36:34)

Re: Час виконання програми

Тоді вам знадобиться така функція:

function fGetTime: LongInt;
var hr, min, sec, sec_100: word;
begin
  GetTime(hr, min, sec, sec_100);
  fGetTime := longint(hr)*360000 + longint(min)*6000 + sec*100 + sec_100;
end;
 
var before, after: longint;
begin
  before := fGetTime;
  ...
  after := fGetTime;
  writeln( (after - before) / 100:0:2 )
end;

(код звільнено і добровільно воз'єднано із форумом внаслідок референдуму звідси)

Подякували: 0xDADA11C71

6

Re: Час виконання програми

У мене PascalABC версія 3.0.1.35.
Цього разу ругається на невідомий ідентифікатор GetTime в 10 рядку.

Uses crt;
const n=100;
var  before, after: longint;
     a: array[1..n] of integer;
     i,j,k,tmp:integer;

function fGetTime: LongInt;
var hr, min, sec, sec_100: word;
begin
  GetTime(hr, min, sec, sec_100);
  fGetTime := longint(hr)*360000 + longint(min)*6000 + sec*100 + sec_100;
end;

begin
     for i:=1 to n do
         a[i]:=random(30);
     writeln('масив');
     for i:=1 to n do
         write(a[i],' ');
     writeln;
   
     before := fGetTime;

     for i:=2 to n do
         begin
         tmp:=a[i];
         j:=1;
         while tmp>a[j] do
               j:=j+1;
         for k:=i-1 downto j do
             a[k+1]:=a[k];
         a[j]:=tmp;
         end;
         
     after := fGetTime;
     writeln( (after - before) / 100:0:2 )
     writeln('відсортований масив');
     for i:=1 to n do
         write(a[i],' ');
end.

7

Re: Час виконання програми

Тоді я вже не знаю. Встановіть собі щось новіше, або почитайте тамтешню довідку...

8

Re: Час виконання програми

а яку версію порадите?

9

Re: Час виконання програми

Останню, з офіційного сайту, звісно, яку ще радять?

10

Re: Час виконання програми

Закачала останній PascalABC.NET. Були проблеми з random при підключеному System. Та все ж знайшла рішення.
Все працює, час рахує. Дякую!)

Подякували: koala1

11 Востаннє редагувалося ADR (11.04.2014 11:07:55)

Re: Час виконання програми

з точністю до мілісекунди

var
  StartTime: Integer;
begin
  StartTime := GetTickCount;
//...
  ShowMessage(IntToStr(GetTickCount - StartTime))
end;

але це у модулі Windows чи WinAPI... не впевнений що таке є на ABCPascal...

12

Re: Час виконання програми

Значення GetTickCount йдуть ривками приблизно по 10мс. Тому його можна використовувати лише на досить великих циклах.

13

Re: Час виконання програми

До речі, цікава історія в тему, може, хто знає, а решті точно буде цікаво - тут і про те, як не треба писати програми, і по зневадження.
Був колись (а подекуди і зараз використовується) такий собі Turbo Pascal 7.0, під MS DOS. Остання його версія вийшла чи то в 1994, чи то в 1995 році - коли найпотужніші процесори ледве-ледве витягали 150-200МГц, а поширені були частоти в 20-60МГц (ага, і 4МБ пам'яті, з яких нормально доступно було менш ніж 600КБ - уявіть собі, так можна було жити). І от раптом з'ясувалося, що всі програми, написані на TP7, падають на нових процесорах з повідомленням "помилка 200" (формально "ділення на 0", але випадало і при інших проблемах). Пам'ятаю, який це був жах, коли на щойно придбаній системі не запускалися старі власні програми - це був десь так рік 1999-й, коли я це побачив...
А проблема була в тому, що модуль CRT мав кілька власних функцій для роботи з часом; і для нормальної роботи йому треба було знати, як системний час співвідноситься з частотою процесора. Сучасні системи можуть таке просто повідомити, але тоді найпростіший спосіб дізнатися щось про залізо був перевірити самому. І там була перевірка - скільки тактів встигне прокрутити процесор за певний час (один тік RTC чи щось таке); але система була 16-бітна, і на швидких комп'ютерах за цей час переповнювався 16-бітний лічильник, що й викликало збій навіть на програмі

uses CRT; begin end.

Зараз всі копії TP7 в мережі вже пропатчені, але певні висновки з цього зробити можна.

Подякували: 0xDADA11C7, Torbins, Volodymyr Rizun3

14

Re: Час виконання програми

А як можна визначити обсяг використаної оперативної пам'яті?

15

Re: Час виконання програми

В .NET це трохи неточно через збирач сміття; можете спробувати

writeln( System.GC.GetTotalMemory( true ) );

тільки врахуйте, що з true воно може виконуватися довго, а з false дасть завищений результат; втім, у випадку true теж правильний результат не гарантується.