Требуется замерить время выполнения алгоритма

 
0
 
Delphi, Kylix and Pascal
ava
Pakshin A. S. | 31.03.2006, 23:08
Появилось желание замерить время выполнения алгоритма в программе для последующей его оптимизации. Завести таймер как-то не хочется, так как не красиво... Поэтому хотелось сделать замер более изящным.

Общая схема мне так представляется:

Цитата


запуск программы

получение данных

запуск секундомера

выполнение алгоритма

остановка секундамера

вывод времени выполнения



Как реализовать? smile
Ответы (11)
ava
Matematik | 31.03.2006, 22:10 #

t:=GetTickCount
{kod}
t:=GetTickCount()-t;
ShowMessage(IntToStr(t)+' мс')
ava
Pakshin A. S. | 31.03.2006, 22:21 #
Спасибо за оригинальный овтет. smile
ava
maxim1000 | 31.03.2006, 22:23 #
еще можно попробовать GetThreadTimes...
ava
cardinal | 31.03.2006, 22:32 #
см. profiler

В Visual C++ ты можешь посмотреть например сколько времени длится каждая функция...
ava
Демо | 01.04.2006, 13:55 #
Pakshin A. S.,
Посмотри на http://forum.vingrad.ru/index.php?showtopi...01&hl=

Очень точно время замерить нельзя - все-таки не система реального времени.

В качестве варианта можешь запкстить поток свысоким приоритетом, в нем алгоритм прогр\нать в цикле раз 100, средние результаты получить.

Либо запускать в консольном приложении, чтобы не влиял GUI.
ava
bems | 01.04.2006, 15:19 #
Только GetThreadTimes!

Цитата (Демо @ 1.4.2006, 13:55 findReferencedText)
В качестве варианта можешь запкстить поток свысоким приоритетом, в нем алгоритм прогр\нать в цикле раз 100, средние результаты получить.
Все равно никаких гарантий. То есть для себя замерить - годиться, а если чтобы на чужой тачке с левым юзером выполнялось, то мало ли что там еще работает и с каким приоритетом.

Только GetThreadTimes!

ava
Демо | 01.04.2006, 15:21 #
Цитата (bems @ 1.4.2006, 15:19 findReferencedText)
Только GetThreadTimes!


С какой стати? Проблемы точно те же - ОС не RealTIme.
Добавлено позднее:
Хотя в отдельном потоке будет точнее.
Да и других факторов много.
ava
bems | 01.04.2006, 15:28 #
Цитата (Демо @ 1.4.2006, 15:21 findReferencedText)
ОС не RealTIme
Ну и что?
если при переходе кернелмод<->юзермод, и при сохранениии-восстановлении контекста потока делать замеры времени (а примерно эту инфу и получает GetThreadTimes, мне так кажеться))) то результат будет точным.
Проблема с реалтаймом-нереалтаймом возникает когда нужно предсказать/установить это время заранее, а если нужно только замерять, какая разница?
ava
AZDesign | 05.04.2006, 11:59 #
Цитата (Pakshin A. S. @ 31.3.2006, 22:08)
Появилось желание замерить время выполнения алгоритма в программе для последующей его оптимизации. Завести таймер как-то не хочется, так как не красиво... Поэтому хотелось сделать замер более изящным.



Общая схема мне так представляется:



Цитата



запуск программы


получение данных


запуск секундомера


выполнение алгоритма


остановка секундамера


вывод времени выполнения






Как реализовать? smile

Измерения проводятся для оптимизации алгоритма на своем компьютере. В этом случае все рассуждения о Real-Time теряют смысл. Есть компьютер со свои быстродействием и своими накладными расходами. До оптимизации и после оптимизации эти параметры не меняются.
В этом случае замер делается просто:

Var
tmBeg,tmEnd : TDateTime
Begin
tmBeg := Now;

.....какой-то код....

tmEnd := Now;
ShowMessage(FormatDateTime('HH:MM:SS.zzz',tmEnd-tmBeg));


ava
bems | 05.04.2006, 13:37 #
Цитата (AZDesign @ 5.4.2006, 11:59 findReferencedText)
Есть компьютер со свои быстродействием и своими накладными расходами
На котором время от времени запускается скринсейвер, просыпаются разные службы или планировщик потоков неожиданно вспоминает, что какая-нибудь низкоприоритетная дрянь уже с полминуты голодает...
GetThreadTimes!
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить