|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.03.2017, 19:32 | #1 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Точность таймеров Windows
Здравствуйте.
Вопрос такого плана: какова предельная точность таймера, работающего на винде ? Вопрос может не точный/не понятный ... Суть - на шарпе я добился точности счёта в 100 мкс. Хочу выше. Какой предел ? Как добиваться ? отвечающие те-же ?
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 03.03.2017 в 19:40. |
03.03.2017, 19:52 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
1)Windows не является системой реального времени, ваш поток может быть отложен.
2)Точность плавает от нагрузки на систему. 3)100мс в общем-то много, вы какой тайминг то применяете? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
03.03.2017, 19:54 | #3 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Не мс, а мкс.
Ручной велосипед-стайл - синхронизация с DateTime.Now.Ticks Это я знаю - именно поэтому я наткнулся на предел в 100 мкс. upd: при загрузке ЦП на 100 % (4+4 ядра) у меня точность проседает до 500 мкс ...
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 04.03.2017 в 18:07. |
03.03.2017, 21:46 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Stopwatch точный таймер, а не DateTime.
только все равно, больше лучше даже не рассчитывать, вы ОС ошиблись. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
03.03.2017, 21:53 | #5 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
DateTime вроде как вообще не таймер ... Я соорудил таймер, который синхронизирован с DateTime.Now, и работает с точностью до 100 мкс. Попытки нарастить точность ни к чему не привели.
К тому же у Stopwatch задача "засечь время"; мне же нужно "отработать раз в определённый период", что Stopwatch не позволит мне сделать.
Подпись ? Не, не слышал ...
|
03.03.2017, 22:12 | #6 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
System.Diagnostics.Stopwatch.GetTim estamp Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
03.03.2017, 22:41 | #7 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Пепел Феникса, ноги моего таймера растут из моей предыдущей темы, а конкретно с этого поста:
Приведённый вами метод не даст то, что мне нужно.
Подпись ? Не, не слышал ...
|
03.03.2017, 23:02 | #8 |
Старожил
Регистрация: 19.06.2013
Сообщений: 2,463
|
Вот те опасные штуковины вам могут помочь ?
http://www.programmersforum.ru/showp...5&postcount=14
Репутация: полный "0"
|
03.03.2017, 23:24 | #9 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Это зависит от того как эту точность мерить.
В системе есть несколько таймеров. RDTSC RTC PM-Timer (ACPI-timer) PIT Дискретность, то с какой частотой отдаёт счётчик таймер. PIT(i8254) - PROGRAMMABLE INTERVAL TIMER, программируемый интервальный таймер В таймере есть три канала, которые можно запрограммировать на разные режимы. Такой таймер может выдавать импульс или генерировать прерывания с частотой p/M где M константа от 1 до 65536. p= 1,19318 МГц – стандартная =f/12 – реальная частота Значение после сброса для M=65536 пропусков, отсюда F= р/65536 =18,2065074 Гц PM TIMER(ACPI TIMER) PM-Power Manadger Устройство контроля энергии энергосберегающего контроля питания и аварийного отключения имеет два встроенных счетчик для обеспечения своих нужд по обработки прерываний. Счетчик этот специфический и не имеет строгого адреса он не позволяет вызывать прерывания IRQ но служит таймером высокой частоты. Этот таймер вызывает SMI прерывания. Которые в свою очередь обрабатывается БИОС’ом в специальном режиме процессора SMM. SMI имеет наивысший приоритет среди прерываний. Для реализации ОС реального времени нет ничего страшнее SMI. Он сбивает обработку других таймеров. Но его можно отключить. APIC TIMER APIC расширенный контролер прерываний он снабжен таймером с большой частотой. Частота зависит от частоты процессора. Частота делится на константу 2,4,8,16,32,64,128. HPET - High Precision Event Timers Частота у HPET больше чем у PIT(i8254). Позволяет подменить каналы старого таймера PIT(i8254). частота стандартная 14,31818 и может быть выше константа считывается. RTC - Real Time Clock, часы реального времени. Компьютер снабжен часами и батарейкой. На старых компьютерах такого не было. И каждый день начинался с чистого листа. Оператор включал электронную вычислительную машину и вводил дату и время. С появлением RTC все стало проще. Теперь компьютер умный он научился сам узнавать время. RTC подключен к генератору с частотой 32.768 КГц. Но сам генерирует прерывания с частотой в зависимости от делителя от 2Гц до 8КГц через степень двойки. ------------------------------------------------------ RDTSC - частота порядка 2٫4 ГГц Частота в большинстве компьютеров постоянна, не меняется во время работы. Дискретность 4-16 тактов процессора. Что равносильно 1-7 нс. RTC Опорная частота 32.768 КГц Дискретность по умолчанию 1024 Гц. Что равносильно 0,9765625 мс. PM-Timer (ACPI-timer) Опорная частота 3,579545 МГц. Дискретность по умолчанию 3,579545 МГц. Что равносильно 279 нс. PIT Опорная частота 1,1918 МГц. Дискретность от 1/1193180 до 65536/1193180. В зависимости от ОС и её настроек. 65536/1193180 = 54٫92 мс (или 18٫2 Гц). 18076/1193180 = 15٫149432 мс (или 66٫009 Гц). 1193/1193180 = 0٫9984 мс (или 1000 Гц). Теперь про ошибки PPM это сколько раз кварцевый резонатор ошибётся на 1 милион раз. В ЭВМ типично стоит 2 резонатора. Один питает RTC другой питает всё остальное. Тот который стоит в RTC имеет точность 100-150 ppm Тот который питает PIT и всё остальное имеет порядка 30-50 ppm. Чем больше температура тем больше ошибок делает кварцевый резонатор. Точность. Что определяет точность? Точность определяет число значащих цифр в числе и чем их больше, тем точнее число. Точнее таймер 0,5/1431818=0,000000349=0,35*10^-6 это значит, что ошибка будет проявляться через 1 миллионов итераций 0,5/14318=0,35*10^-4 при такой точности ошибка будет заметна при 10 тыс. итераций 0,5/32768=0,15*10^-4 аналогично. Цифры цифрами, но что они значат в реалии? В стуках 60*60*24=86 400 секунд Это цифра превышает 10 тыс. Это значит что ошибка в сутках для RTC ,будет составлять 0,15*10^-4*86400=1.32 c. Тут было выбрано абсолютная ошибка 0,5 из расчета того, что таймер генерирует с заданной частотой. На самом деле это не совсем так погрешность любого кварцевого генератора составляет 30-50 миллионных, для более точных на порядок. И того имеем погрешность 30*10^-6*86400=2.6 с 50*10^-6*86400=4.32 с Практика показывает, что оно так и есть ошибка порядка 3,5-4,5 с Ошибка носит систематический характер. За неделю набегает полминуты 4*7=28 с. Почему мы не видим эту ошибку? Всё очень просто каждый день раз в 4 часа виндоус обращается к серверу времени и проводит синхронизацию ваших часов. Сервер времени подключён к системе единого времени(СЕВ) Все часы в мире ежедневно подстраиваются от часов с атомным стандартом частоты. Эти специальные часы имеют ошибку 10^-14. Для наглядности 1 ppm это 10^-6 Функции FileTime(), DateTime() - как правило привязаны к RTC. Имеют точность 1 секунда. GetTickCount() - привязан к PIT. Всегда имеет усредненную точность 15٫16 мс (там периодическая последовательность dT = 15 15 15 15 15 16 мс). Тут под словом всегда имеется в виду что в ходе моих экспериментов расхождений не выявлено. Для игр стоит использовать мультимедийный таймер функции timeGetTime(), timeKillEvent(), и timeSetEvent(). Он уже будет гарантированно работать с точностью 15,16 мс. И при настройке системы 1 мс. timeBeginPeriod(1); // Устанавливаем время срабатывания мультимедийного таймера в 1мс Этот параметр влияет на все программы в ОС. Так что не удивляйтесь если другая программа сделала это раньше вас. Функции QueryPerformanceFrequency(Freq); QueryPerformanceCounter(Coun1); Эти функции привязываются к самому быстрому таймеру по версии ОС и не зависят от частоты процессора. Встречал разные варианты, всё чаще последний вариант. PIT, ACPI-Timer, APIC-Timer (для краткости аналог RDTSC). ассемблерная команда asm RDTSC end; На разных ядрах счётчики RDTSC несинхронны. Поэтому если ОС решит перекинуть вас с ядра на ядро то разница RDTSC()-LastTime может оказаться отрицательной. Я уже писал о дискретности в 2 нс. Так вот при включении виртуализации значения этого счётчика можно перепрограммировать как захочет гипервизор. Обычно виртуальные машины перехватывают обращение к этому таймеру и его дискретность доходит снижается до 1-10 мкс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 03.03.2017 в 23:42. |
03.03.2017, 23:24 | #10 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Теперь поговорим про реальное время. Виндоус это ОС с вытесняющей многозадачностью. Это значит что вашу программу могут оттеснить от процессора и скинуть в ОЗУ или даже на жёсткий диск.
Время смены контекста, а также обращения к ядру составляет 1-10 мкс см документацию на ваш процессор. Это значит что раз в 1000 Гц у вас будут паузы по 1-10 мкс вызванные прерываниями. Аппаратные прерывания вещь переменная их может быть и 100 раз/с в энергосберегающем режиме и в пике 10 000 раз/с . Замеры показали что если задача активная, то она практически не вытесняется и время паузы не бывает больше 250 мс. На вытеснение влияет загруженность процессора, наличия сложной задачи работающей в параллели (антивирус начал проверять большой файл с архиовом, кодирование видео). Обычно антивирус почти не влияет и как далее увидите, что даже 2 антивируса могут не оказывать существенных влияний. Вот взял померил что у меня сейчас. Бывает хуже в 10 бывает лучше в 10 раз. Что я намерил в течении 20 секунд? Мою задачу прервали 15 раз. В среднем между прерываниями была 2 секунды. максимальная пауза составила в работе моей программы составила 5 мс в среднем 3 мс. Программа с ядра на ядро не скакала. TimeError: Summ =20,403054 - время теста Mean =0,003041 - среднее время между 2 мс циклом MeanN=0,003038 - другой алгоритм измерения StdDev =0,000115 - средне квадратичное отклонение пауз StdDevN=0,000096 - другой алгоритм измерения. Max=0,005976 - максимальная пауза dt =2,027070537 - разница между паузами NMax=15 - количество пауз. MaxMinus = 0,00 MinusN=0 Что касается точности замеров работы программы. Чем дольше работает ваша программа тем точнее измерения точность растёт. Но есть нюанс из-за вытеснения точность на интервале от 4 до 0٫001 секунд СКО падает на интервале 1000 до 4 с точность измерения 0,001 СКО На интервале 4 секунды до 1 мс точность измерения от 0,5 до 0,01 СКО На интервале от 10 до 1 мс точность от 0,001 до 0٫0005 СКО На интервале от 0 до 1 мкс точность 0,001 СКО А на последнем просто не успевает вырасти. Что касается таймера на сообщениях, а также его производные как-то Thread.Sleep. То они работает как захочется левой пятке ведущему разработчику ОС. http://www.programmersforum.ru/showthread.php?t=303527 Забыл упомянуть про немаскеруемые прерывания и режим SMM. БИОС может перехватывать управление на себя. Обычно это безобидно и составляет несколько 1-10 мкс, но на некоторых компьютерах такое прерывание может длиться и 500 мс. PS. Простите математикам за любовь к цифрам. Лень делать пояснительные картинки.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 03.03.2017 в 23:48. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
По работе таймеров | Illusiony | Компоненты Delphi | 12 | 24.04.2015 18:19 |
Как создать больше таймеров? | jone | Общие вопросы Delphi | 39 | 26.04.2013 10:18 |
Работа с таймеров в Qt | papos | Общие вопросы C/C++ | 0 | 14.11.2010 20:05 |
Менеджер таймеров | Alex Cones | Общие вопросы Delphi | 9 | 11.11.2010 19:34 |
Варианты реализации программы с использованием таймеров | Casper-SC | Общие вопросы Delphi | 10 | 28.11.2009 19:18 |