|
|
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Есть в моей библиотеке такая вещь как штамп времени Долго я его выстрадывал. Там суть в том, чтобы в Int64 запихнуть высокоточный замер времени И в POSIX это удаётся сделать просто, там есть функция clock_gettime, она достаточно быстрая и даёт точность до наносекунд А в Windows появились сложности. Я вычитал, что GetSystemTimeAsFileTime работает очень быстро и имеет высокую точность (до 10й части микросекунды). Проблема началась тогда, когда я стал замерять дельту времени с помощью этого штампа. Оказалось, метод имеет такую же погрешность как и GetTickCount - в районе 15мс. Код: 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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. В итоге я не знаю, что делать под виндой. Было желание поиграться с QueryPerformanceCounter, но не совсем ясно, как его привязать к датам. Плюс лет 10 назад я сталкивался с проблемой, что в зависимости от ядра замер времени различался, получалось, что замер времени мог быть отрицательным. Есть у кого-то опыт и мысли по решению задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 12:17 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
System.Diagnostics.TStopwatch.GetTimeStamp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 12:46 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
rgreat, Так он и делает QueryPerformanceCounter Только как ты этот штамп времени переведёшь в дату? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 12:55 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Исходники посмотри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 12:56 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
rgreat, А ты сам то смотрел? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 13:21 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
NtQuerySystemTime ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:08 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey NtQuerySystemTime [NtQuerySystemTime may be altered or unavailable in future versions of Windows. Applications should use the GetSystemTimeAsFileTime function.] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:20 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey NtQuerySystemTime Хотя, нет. Не подойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:20 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Слушай, спасибо Похоже это то, что нужно А что у неё с поддержкой? Я так понял с Windows 2000? Есть какая-то информация по производительности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:21 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
alekcvp, maybe yes, maybe no, maybe rain, maybe snow... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:22 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
alekcvp Kazantsev Alexey NtQuerySystemTime [NtQuerySystemTime may be altered or unavailable in future versions of Windows. Applications should use the GetSystemTimeAsFileTime function.] Бл* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:34 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Штамп времени - неадекватная мысль сама по себе, так что способ его получения уже безразличен. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:50 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 14:59 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Если бы это высказал кто-то другой, я бы даже не переспрашивал Но так как это говоришь ты, я всё-таки спрошу С чего такие мысли? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 15:03 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Точность до наносекунд на НЕ-рилтайм ОС - это желание странного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 16:05 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Cobalt747, Ну мне до наносекунд и не нужна Обычно нужна до миллисекунд. Но GetTickCount даёт большую погрешность В целом вариант точности до микросекунд (1 / 1000000 секунды) с учётом UTC и возможностью перевести в локальное время - на мой взгляд весьма крутая штука. Практически это закрывает все задачи с таймингом. Будь то замер времени или логирование то же Плюс это универсальный формат для разных ОС, можно передавать по сети Кажется, я знаю как решить задачу для винды ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 16:37 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Есть у кого-то опыт и мысли по решению задачи? Такая точность только на DSP достижима, и то не на всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 16:42 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Жесть, сколько тут людей, не верящих в собственные силы ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 16:47 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUОбычно нужна до миллисекунд. И вот тут вплывает "проблема XYZ" и встаёт вопрос "для чего она нужна". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 16:54 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Обычно нужна до миллисекунд. Но GetTickCount даёт большую погрешность Разрешение у NtQuerySystemTime и GetSystemTimeAsFileTime плавающее. Его можно изменить вызовами NtSetTimerResolution (теоретически, можно получить субмиллисекундное разрешение) и вызовом timeBeginPeriod(1) (разрешение 1 миллисекунда). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 16:58 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Я новичок? Ну ок :) Краткий ответ - для всего, где нужен тайминг :) У меня что-то типа компании, совсем начинающей, я специализируюсь на Delphi. Иногда приходят задачи по доработке легаси проектов. Соответственно и библиотеки я пытаюсь разрабатывать таким образом, чтобы Delphi, начиная с 7 версии, поддерживался. Так вот когда я лепил бенчмарки, оказалось, что мой штамп времени для замера времени не подходит, поскольку имеет высокую погрешность. Пришлось лепить поверх System.Diagnostics.TStopwatch. Мелочь конечно, но неприятно. У меня есть синхронизирующие примитивы. Там можно выставить таймаут. И считается он поверх таймштампа. Соответственно сейчас погрешность составляет 15 миллисекунд. В скором времени буду переделывать логгер. Стандартное форматирование активно использует буферные строки, что на многопоточных приложениях приводит к блокировке. Получается если погрешность на логгере составляет 15 миллисекунд, значит на некоторых строках, особенно если логироваться из разных потоков, картина будет не соответствующая действительности. Необходимость в UTC таймштампе с высокой точностью загрела давно. И под Posix этот вопрос решается на раз-два. Вопрос был в том, как добиться высокой точности и привязке к дате на винде. Если я похож на новичка, который не умеет задать вопрос, это конечно прикольно. Но ты то меня должен знать давно. Соответственно и ассоциаций таких быть не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 17:12 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Я решил делать QueryPerformanceCounter с UTC-инкрементом. Спасибо, что прояснил ситуацию Это была очень полезная информация ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 17:13 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Соответственно сейчас погрешность составляет 15 миллисекунд. Мне крайне любопытно, каким способом можно повысить точность если Винда решит, что в этот момент у нее есть более приоритетные задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 17:43 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНо ты то меня должен знать давно. Именно это и заставило меня заподозрить, что ты маешься фигнёй. И ты это только что подтвердил. Бенчмарки приводятся к нужной точности удлинением мерной мили. Синхронизирующие примитивы не требуют точных таймаутов. В них таймаут это нештатная ситуация сам по себе. А таймаут поверх таймштампа даёт такие забавные глюки при переполнении, что лучше вообще в эту сторону не смотреть. Специальные случаи типа видеопроигрывателя или игрового движка решается специальными же средствами класса ожидания вертикальной синхронизации и мультимедийными таймерами. Там нужно не время, а промежуток от момента А до момента Б. Логгеру вообще таймштампы нужны исключительно для косметики, а идентификация последовательности событий решается сериализацией их записи. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 17:46 |
|
||
|
Адекватный способ получить штамп времени
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис, Ты не понял Операция может занимать 14 мс Но такой замер времени покажет 0 Вообще 1мс - это огромный промежуток времени для процессора Можно несколько миллионов операций за это время провести ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2020, 17:47 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40013986&tid=2037884]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
150ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
98ms |
get tp. blocked users: |
2ms |
| others: | 210ms |
| total: | 501ms |

| 0 / 0 |
