Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Как можно на Pascal сделать процедуру подсчета времени выполнения программы

Автор: Coconut 7.01.2007 4:57

Как на Pascal сделать процедуру выполняющую подсчет времени выполнения программы? Нужна для сравнения скорости выполнеия сортировок.
У меня есть на Delphi. Можно ли ее переделать?
var
OperBegin, OperEnd: TTimeStamp;
Total: LongWord;

begin
OperBegin := DateTimeToTimeStamp(Now); {запоминается момент начала
операции}

{Здесь размещается код операции}

OperEnd := DateTimeToTimeStamp(Now); {запоминается момент окончания
операции}
Total := OperEnd.Time - OperBegin.Time;
end;

Автор: Bokul 7.01.2007 5:07

Вот, посмотри http://forum.pascal.net.ru/index.php?s=&showtopic=14902&view=findpost&p=86265 . Для Делфи тоже самое. Если надо точнее, то QueryPerformanceCounter и QueryPerformanceFrequency, о них можно почитать http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers.asp

Автор: Coconut 7.01.2007 5:31

Спасибо. Но у меня возникла небольшая проблема, при использовании uses windows; вылетает ошибка file windows.tpu не найден, если можете, скиньте, и путь где он должен лежать

Автор: volvo 7.01.2007 5:32

Какой компилятор у тебя?

Автор: Coconut 7.01.2007 5:35

BP 7.0

Автор: Malice 7.01.2007 5:54

http://forum.pascal.net.ru/index.php?showtopic=1741&st=40&p=34169&#entry34169

Автор: Bokul 7.01.2007 5:55

Вместо

uses windows; 

попробуй написать
uses winprocs;


P.S. Ведь BP 7.0 работает с WinApi?

Автор: Coconut 7.01.2007 6:26

Спасибо. Воспользовался Meml, вроде как заработало, потому что в массив ввел всего 50 элементов (на больше меня не хватило) smile.gif , а с функцией random знаком плохо, завтра разбеоусь, и проверю еще раз. Еще раз спасибо всем.

с winprocs - аналогично

Автор: Bokul 7.01.2007 6:36

Можно также работать с досовской процедурой GetTime(Var Hour,Minute,Second,Sec100:word), но будет медленнее + мороки больше.

Автор: volvo 7.01.2007 17:24

Цитата(Bokul @ 7.01.2007 1:36)
будет медленнее + мороки больше.

Ну, прямо таки больше? smile.gif
http://forum.pascal.net.ru/index.php?s=&showtopic=8585&view=findpost&p=58499

А насчет "медленнее" - можно узнать, что ты имел в виду?

Автор: Coconut 7.01.2007 19:46

Спасибо, volvo. Запустил, один раз заработало - выывела результат на 20 элементах, потом и на 30 показывает 0, думаю мало элементов, как массиву типа pchar присвоить значения с помощью random?

Автор: Coconut 7.01.2007 20:50

Запустил отладку вручную, gettime работает. Следовательно, мало элементов.

Автор: Bokul 7.01.2007 23:23

Цитата
как массиву типа pchar присвоить значения с помощью random?

Так генерируем случайную букву латинского алфавита:

randomize;
writeln(random(chr(random(25)+97));



Цитата
Ну, прямо таки больше?

Она не покажет правильный результат, если прогу тестировать в полночь.. blum.gif
Цитата
А насчет "медленнее" - можно узнать, что ты имел в виду?

Обратится один аз к памяти медленнее чем делать столько вычислений + опять таки обращаться к памяти?

Автор: Bokul 7.01.2007 23:54

Еще добавлю - способ с досовским таймером будет влиять на увеличения засекаемого времени, ведь после самого взятия время мы тратим некоторые доли секунд на преобразование в LongInt, что дает погрешность.

Автор: volvo 8.01.2007 0:18

Цитата
Еще добавлю - способ с досовским таймером будет влиять на увеличения засекаемого времени, ведь после самого взятия время мы тратим некоторые доли секунд на преобразование в LongInt, что дает погрешность.
Правда? А ничего, что время на конвертацию в LongInt при первом вызове практически идентично времени на ту же конвертацию при втором вызове? Дальше продолжить, или догадаешься? Это первое...

Второе - НЕТ совершенно безошибочного способа, даже QueryPerformanceCounter будет давать тебе результаты, которые можно будет признать некорректными, ибо Windows - вообще-то не RT OS... Выбирать надо способ, дающий достаточную точность...

Автор: Bokul 8.01.2007 0:25

Цитата
Выбирать надо способ, дающий достаточную точность...

Так какой точнее?

Автор: Malice 8.01.2007 1:44

Цитата(Bokul @ 7.01.2007 19:23) *

writeln(random(chr(random(25)+97));

Вот так все таки:
writeln(chr(random(25)+97));

Автор: Coconut 15.01.2007 17:51

Всем огромное спасибо и признательность за помощь. Использовал Gettime, при сортировке 10000 элементов получил время в 5 мс, задачу сдал.