|
|
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
Разработал модуль для удобного замера точных интервалов времени. Ссылка на модуль: https://github.com/loginov-dmitry/multithread/blob/master/CommonUtils/TimeIntervals.pas Основу модуля составляет record TTimeInterval, в котором имеется метод Start для запуска замера, Stop для останова замера и набор методов ElapsedXXX, позволяющих определить, сколько прошло времени с начала замера. Можно использовать в Delphi 2007 и более новых версиях. Текущая реализация - только под Windows. Вот объявление структуры TTimeInterval: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. Как видно, результат замера времени можно получить в разных форматах: в миллисекундах, в микросекундах, в секундах, в отсчётах высокочастотного таймера, а также в стандартном TDateTime. Пример использования: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Также можно остановить замер с помощью метода Stop, а вызов метода ElapsedXXX выполнить позже, в удобное время. Высокая точность измерения (практически до микросекунды) обеспечивается за счёт запоминания длительности вызова QueryPerformanceCounter в переменной PerformanceIgnoredTicks (она учитывается при останове замера). Кроме того, в модуле TimeIntervals имеется ещё одна структура, упрощающая логирование длительности серии операций: TTimeIntervalEvents. Пример её использования: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Я считаю, что данное решение более удобное и более продуманное, чем структура "секундомер", встроенная в современные версии Delphi (имеется ввиду TStopWatch из System.Diagnostics). TStopWatch - это, на мой взгляд, очень слабо продуманное решение, которое зачем-то срочно (с пивом за вечер) понадобилось сделать. Я сужу по его реализации в Delphi 10.3 (может в 10.4 что-то и улучшили). Какие лично у меня замечания к TStopWatch: 1. Является секундомером, однако секунды измерять не умеет. 2. Ничего кроме миллисекунд (и неких условных единиц) не возвращает. 3. Не является интуитивно понятным. Думаете метода Start там достаточно для запуска секундомера? Нифига! Start там - это лишь продолжение замера, который был поставлен на паузу с помощью метода Stop. Stop - это не останов замера (как кажется из названия)! Это лишь постановка на паузу. 3.1 Для начала замера времени обязательно нужно вызвать метод TStopWatch.StartNew. 4. Какое отношение вообще секундомер имеет к диагностике? Могли бы сделать секундомер в виде компонента с циферками, было бы более логично! Спасибо за внимание! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2020, 00:39 |
|
||
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
DmSer, очень хотелось бы микро и нано секунды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2020, 08:43 |
|
||
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
cptngrb DmSer, очень хотелось бы микро и нано секунды Насколько я понимаю, в наносекундах умеют измерять профилировщики. У меня нет задачи сделать профилировщик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2020, 09:05 |
|
||
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
У меня для этих целей используется класс TOSTime: https://github.com/d-mozulyov/Tiny.Library/blob/master/Tiny.Types.pas#L765 И в качестве основы для винды была взята LocalFileTimeToFileTime Т.к. самая быстрая и, судя по документации, имеет высокую точность Я ещё не разбирался, но вроде бы она работает с большой гранулярностью Не знаешь, можно ли, получая QueryPerformanceCounter, преобразовывать его к UTC? Логически напрашивается иметь какую-то переменную-смещение. Но во-первых, QueryPerformanceCounter скорее всего быстро переполнится. Во-вторых, я слышал, что он разный на разных ядрах. Что ты по этому поводу думаешь? P.S. Поскольку тебе интересны потоки, возможно тебе будет интересен TaggedPtr для реализации lock-free контейнеров ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2020, 09:36 |
|
||
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2020, 13:37 |
|
||
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
Bred eFeM, Пишут, поддержка с Windows 8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2020, 13:45 |
|
||
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Но во-первых, QueryPerformanceCounter скорее всего быстро переполнится. Во-вторых, я слышал, что он разный на разных ядрах. Что ты по этому поводу думаешь? Я реализовал модуль TimeIntervals и больше не думал о QueryPerformanceCounter. Чувствую себя нормально! :) SOFT FOR YOU P.S. Поскольку тебе интересны потоки, возможно тебе будет интересен TaggedPtr для реализации lock-free контейнеров Предпочитаю использовать готовые контейнеры, а не создавать свои. До сих пор на работе старый Delphi, но если обновят, то попробую твои словари. Как-то год назад делал тесты, они показали наибольшую производительность среди других решений. Правда, была какая-то проблема с перечислениями значений в цикле for in. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2020, 21:49 |
|
||
|
Модуль для удобного замера точных интервалов времени
|
|||
|---|---|---|---|
|
#18+
DmSer, Да, с for in была какая-то ошибка, сейчас исправлено Насчёт контейнеров... ну они же не обязательно дженерики ) Условно говоря лок-фри стек реализовать без TaggedPtr сложно Библиотека (кроме дженериков) работает начиная с Delphi 7 Там и другие плюшки есть ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2020, 22:18 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39980176&tid=2038149]: |
0ms |
get settings: |
9ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 348ms |

| 0 / 0 |
