Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Windows
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2017, 19:32   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Точность таймеров Windows

Здравствуйте.
Вопрос такого плана: какова предельная точность таймера, работающего на винде ?
Вопрос может не точный/не понятный ...
Суть - на шарпе я добился точности счёта в 100 мкс. Хочу выше. Какой предел ? Как добиваться ?

отвечающие те-же ?
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 03.03.2017 в 19:40.
OmegaBerkut вне форума Ответить с цитированием
Старый 03.03.2017, 19:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)Windows не является системой реального времени, ваш поток может быть отложен.
2)Точность плавает от нагрузки на систему.
3)100мс в общем-то много, вы какой тайминг то применяете?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.03.2017, 19:54   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
3)100мс в общем-то много, вы какой тайминг то применяете?
Не мс, а мкс.
Ручной велосипед-стайл - синхронизация с DateTime.Now.Ticks
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
2)Точность плавает от нагрузки на систему.
Это я знаю - именно поэтому я наткнулся на предел в 100 мкс.
upd: при загрузке ЦП на 100 % (4+4 ядра) у меня точность проседает до 500 мкс ...
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 04.03.2017 в 18:07.
OmegaBerkut вне форума Ответить с цитированием
Старый 03.03.2017, 21:46   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
синхронизация с DateTime.Now.Ticks
Stopwatch точный таймер, а не DateTime.
только все равно, больше лучше даже не рассчитывать, вы ОС ошиблись.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.03.2017, 21:53   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Stopwatch точный таймер, а не DateTime
DateTime вроде как вообще не таймер ... Я соорудил таймер, который синхронизирован с DateTime.Now, и работает с точностью до 100 мкс. Попытки нарастить точность ни к чему не привели.
К тому же у Stopwatch задача "засечь время"; мне же нужно "отработать раз в определённый период", что Stopwatch не позволит мне сделать.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 03.03.2017, 22:12   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
DateTime вроде как вообще не таймер ... Я соорудил таймер, который синхронизирован с DateTime.Now, и работает с точностью до 100 мкс. Попытки нарастить точность ни к чему не привели.
К тому же у Stopwatch задача "засечь время"; мне же нужно "отработать раз в определённый период", что Stopwatch не позволит мне сделать.
ну читайте доку тогда по классу
System.Diagnostics.Stopwatch.GetTim estamp
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.03.2017, 22:41   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса, ноги моего таймера растут из моей предыдущей темы, а конкретно с этого поста:
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
...
Код:
while (какое нибудь условие выхода)
{
	рассчитали время;
	вывели время;
	Thread.Sleep(касарь-DateTime.Now.Millisecond);
}
...
Приведённый вами метод не даст то, что мне нужно.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 03.03.2017, 23:02   #8
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Вот те опасные штуковины вам могут помочь ?
http://www.programmersforum.ru/showp...5&postcount=14
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 03.03.2017, 23:24   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 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.
Pavia вне форума Ответить с цитированием
Старый 03.03.2017, 23:24   #10
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 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.
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
По работе таймеров 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