Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Требуется замерить время выполнения алгоритма


Автор: Pakshin A. S. 31.3.2006, 22:08
Появилось желание замерить время выполнения алгоритма в программе для последующей его оптимизации. Завести таймер как-то не хочется, так как не красиво... Поэтому хотелось сделать замер более изящным.

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

Цитата

запуск программы
получение данных
запуск секундомера
выполнение алгоритма
остановка секундамера
вывод времени выполнения


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

Автор: Matematik 31.3.2006, 22:10
Код

t:=GetTickCount
{kod}
t:=GetTickCount()-t;
ShowMessage(IntToStr(t)+' мс')

Автор: Pakshin A. S. 31.3.2006, 22:21
Спасибо за оригинальный овтет. smile

Автор: maxim1000 31.3.2006, 22:23
еще можно попробовать GetThreadTimes...

Автор: cardinal 31.3.2006, 22:32
см. profiler

В Visual C++ ты можешь посмотреть например сколько времени длится каждая функция...

Автор: Alex 1.4.2006, 06:32
http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=309202

Автор: Демо 1.4.2006, 13:55
Pakshin A. S.,
Посмотри на http://forum.vingrad.ru/index.php?showtopic=84401&hl=

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

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

Либо запускать в консольном приложении, чтобы не влиял GUI.

Автор: bems 1.4.2006, 15:19
Только GetThreadTimes!

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

Только GetThreadTimes!


Автор: Демо 1.4.2006, 15:21
Цитата(bems @ 1.4.2006, 15:19 Найти цитируемый пост)
Только GetThreadTimes!


С какой стати? Проблемы точно те же - ОС не RealTIme.
Добавлено @ 15:23
Хотя в отдельном потоке будет точнее.
Да и других факторов много.

Автор: bems 1.4.2006, 15:28
Цитата(Демо @ 1.4.2006, 15:21 Найти цитируемый пост)
ОС не RealTIme
Ну и что?
если при переходе кернелмод<->юзермод, и при сохранениии-восстановлении контекста потока делать замеры времени (а примерно эту инфу и получает GetThreadTimes, мне так кажеться))) то результат будет точным.
Проблема с реалтаймом-нереалтаймом возникает когда нужно предсказать/установить это время заранее, а если нужно только замерять, какая разница?

Автор: AZDesign 5.4.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));



Автор: bems 5.4.2006, 13:37
Цитата(AZDesign @ 5.4.2006, 11:59 Найти цитируемый пост)
Есть компьютер со свои быстродействием и своими накладными расходами
На котором время от времени запускается скринсейвер, просыпаются разные службы или планировщик потоков неожиданно вспоминает, что какая-нибудь низкоприоритетная дрянь уже с полминуты голодает...
GetThreadTimes!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)