Время в программе
От: LaptevVV Россия  
Дата: 10.06.16 08:19
Оценка:
Пока у меня была чисто последовательная прога — особо не заморачивался.
Для грубой оценки времени работы использовал просто clock().
Теперь в паре мест появились треды и clock() вроде как выдает не совсем то, что есть на самом деле.
Посоветуйте:
— либо использовать стандартную либу chrono
— либо WinAPI-функцию (кстати, мудреное название — никак не запомню... )

Надо поизмерять время для построения графиков в статью. Поэтому миллисекунды вполне сгодятся...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Время в программе
От: chaotic-kotik  
Дата: 10.06.16 09:48
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Пока у меня была чисто последовательная прога — особо не заморачивался.

LVV>Для грубой оценки времени работы использовал просто clock().

clock() возвращает CPU-time

LVV>Теперь в паре мест появились треды и clock() вроде как выдает не совсем то, что есть на самом деле.




LVV>Посоветуйте:

LVV>- либо использовать стандартную либу chrono
LVV>- либо WinAPI-функцию (кстати, мудреное название — никак не запомню... )

чтобы что-нибудь посоветовать, нужно знать что-нибудь про объект измерения, может вам rdtsc нужно использовать?

LVV>Надо поизмерять время для построения графиков в статью. Поэтому миллисекунды вполне сгодятся...


Если совсем не важно что там да как, то можно просто через time измерять время работы всего приложения, но вообще тема сложная, люди книги по ней пишут (https://www.amazon.com/Guide-Experimental-Algorithmics-Catherine-McGeoch/dp/0521173019/ref=sr_1_1?ie=UTF8&qid=1465551699&sr=8-1&keywords=experimental+algorithmics).
Re[2]: Время в программе
От: LaptevVV Россия  
Дата: 10.06.16 09:57
Оценка:
LVV>>Пока у меня была чисто последовательная прога — особо не заморачивался.
LVV>>Для грубой оценки времени работы использовал просто clock().
CK>clock() возвращает CPU-time
Ну, дык мне и нормально было...
LVV>>Посоветуйте:
LVV>>- либо использовать стандартную либу chrono
LVV>>- либо WinAPI-функцию (кстати, мудреное название — никак не запомню... )
CK>чтобы что-нибудь посоветовать, нужно знать что-нибудь про объект измерения, может вам rdtsc нужно использовать?
Это вряд ли.
LVV>>Надо поизмерять время для построения графиков в статью. Поэтому миллисекунды вполне сгодятся...
CK>Если совсем не важно что там да как, то можно просто через time измерять время работы всего приложения, но вообще тема сложная, люди книги по ней пишут (https://www.amazon.com/Guide-Experimental-Algorithmics-Catherine-McGeoch/dp/0521173019/ref=sr_1_1?ie=UTF8&qid=1465551699&sr=8-1&keywords=experimental+algorithmics).
Это все понятно.
Но мне достаточно следующего:
от 0 до 1 с шагом 0.0000...
Заполняется некая решетка.
Надо отследить накопляемое время на каждом шаге.
Если б это было в одном цикле — проблем нет.
Но алгоритм разбит на несколько частей и там под ногами мешаются пара мест с тредами.
Я вот нарыл на MSDN функцию QueryUnbiasedInterruptTime
С другой стороны в стандартной либе chrono есть steady_clock
В общем, я так понимаю, опять надо просто экспериментировать...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Время в программе
От: so5team https://stiffstream.com
Дата: 10.06.16 12:45
Оценка: 11 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Надо поизмерять время для построения графиков в статью. Поэтому миллисекунды вполне сгодятся...


Если достаточно совсем простого, то std::chrono::high_resolution_clock.
Если хочется чего-то посложнее, то можно посмотреть вот в эту статью -- либо на сами фреймворки, либо на их реализации.
Re: Время в программе
От: pik Италия  
Дата: 10.06.16 13:15
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:


LVV>Надо поизмерять время для построения графиков в статью. Поэтому миллисекунды вполне сгодятся...

std::chrono сейчас в моде
мне так больше boost::posix_time понравилось, както понятнее, форматиерование в iso-стринг тут както уже
подходящее было и код короче и яснее получился
Re: Время в программе
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.06.16 13:21
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Надо поизмерять время для построения графиков в статью. Поэтому миллисекунды вполне сгодятся...


QueryPerformanceCounter()

Миллисекунды, кстати, не годятся. Рано или поздно захочется померить "расстояние" между принятыми подряд пакетами, а там времена микросекундные.
Re[2]: Время в программе
От: kov_serg Россия  
Дата: 10.06.16 13:41
Оценка: 11 (1)
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, LaptevVV, Вы писали:

LVV>>Надо поизмерять время для построения графиков в статью. Поэтому миллисекунды вполне сгодятся...
Pzz>QueryPerformanceCounter()
Pzz>Миллисекунды, кстати, не годятся. Рано или поздно захочется померить "расстояние" между принятыми подряд пакетами, а там времена микросекундные.
На многоядерных AMD был прикол с QueryPerformanceCounter
Этот счетчик для каждого ядра свой и ходят они в зависимости от частоты ядра. А она может меняться. Даже патч выпучкали котрый их синхронизировал переодически.
В результате когда на одной из машин стали получать ход времени в обратну сторону все очень повеселились. Пришлось внедрить костыль в виде установки affinity на одно ядро в таких случаях.

В результате в винде самый вменяемый таймер оказался мультимедийный таймер
его точность хода 1мс, у GetTickCount шаг 16мс (но бывает и 10мс)

Вообще посмотрите это
http://www.cise.ufl.edu/~sb3/files/pmc.pdf
https://software.intel.com/en-us/articles/intel-performance-counter-monitor
http://stackoverflow.com/questions/8091182/how-to-read-performance-counters-on-i5-i7-cpus
Отредактировано 10.06.2016 13:57 kov_serg . Предыдущая версия . Еще …
Отредактировано 10.06.2016 13:45 kov_serg . Предыдущая версия .
Re[3]: Время в программе
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.06.16 14:30
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>На многоядерных AMD был прикол с QueryPerformanceCounter

_>Этот счетчик для каждого ядра свой и ходят они в зависимости от частоты ядра. А она может меняться. Даже патч выпучкали котрый их синхронизировал переодически.

Ну, насколько я понимаю, это так или иначе уже починили.

_>В результате в винде самый вменяемый таймер оказался мультимедийный таймер

_>его точность хода 1мс, у GetTickCount шаг 16мс (но бывает и 10мс)

Насколько я помню, евонная точность является глобальным системным параметром, причем невозможно повысить ее временно, пока надо, а потом вернуть взад (т.е., технически, конечно, возможно, но если за это время другая программа сделает то же самое, а мы вернем таймер взад, то у другой программы случится неприятный сюрприз). А держать его все время на высокой точности может быть не очень хорошо в плане увеличения энергопотребления системы (для поделки это терпимо, а для продаваемой массовой программы не очень).
Re[3]: Время в программе
От: Pavel Dvorkin Россия  
Дата: 11.06.16 03:59
Оценка: 11 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Заполняется некая решетка.

LVV>Надо отследить накопляемое время на каждом шаге.
LVV>Если б это было в одном цикле — проблем нет.
LVV>Но алгоритм разбит на несколько частей и там под ногами мешаются пара мест с тредами.

Что получить-то надо ? Астрономическое время, которое все эти потоки работали или же время работы каждого потока ?

Если первое — QueryPerfomanceCounter/QueryPerfomanceFrequency перед запуском всей этой конструкции и после ее завершения.

Если второе — GetThreadTimes по каждому потоку в момент его окончания (делает основной поток в момент, когда дождался окончания дочернего потока)

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683237(v=vs.85).aspx
With best regards
Pavel Dvorkin
Re[4]: Время в программе
От: ononim  
Дата: 12.06.16 22:01
Оценка:
Pzz>Ну, насколько я понимаю, это так или иначе уже починили.
_>>В результате в винде самый вменяемый таймер оказался мультимедийный таймер
_>>его точность хода 1мс, у GetTickCount шаг 16мс (но бывает и 10мс)
Pzz>Насколько я помню, евонная точность является глобальным системным параметром, причем невозможно повысить ее временно, пока надо, а потом вернуть взад (т.е., технически, конечно, возможно, но если за это время другая программа сделает то же самое, а мы вернем таймер взад, то у другой программы случится неприятный сюрприз).
timeBeginPeriod()/timeEndPeriod() имеют внутренний "счетчик ссылок" и стратегию владения, потому свой timeBeginPeriod отменить можно, а чужой — не выйдет. Более того, неотмененные timeBeginPeriod-ы автоматом отменяются при издыхании процесса. Но надолго его захватывать без необходимости не нужно.
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.