Почему время сна Sleep (1) кажется переменным в Windows? - PullRequest
2 голосов
/ 26 октября 2010

На прошлой неделе мне нужно было протестировать несколько различных алгоритмических функций и, чтобы облегчить себе задачу, я добавил несколько искусственных снов и просто измерил время. Примерно так:

start = clock();
for (int i=0;i<10000;++i)
   {
   ...
   Sleep(1);
   ...
   }
end = clock();

Поскольку аргумент Sleep выражается в миллисекундах, я ожидал, что общее время настенных часов составит около 10 секунд (намного больше из-за алгоритмов, но это сейчас не важно), и это действительно был мой результат.

Этим утром мне пришлось перезагрузить компьютер из-за новых исправлений Microsoft Windows, и, к моему удивлению, Sleep (1) больше не занимал 1 миллисекунду, а около 0,0156 секунды.

Таким образом, результаты моего теста были полностью искажены, так как общее время выросло с 10 секунд до примерно 156 секунд.

Мы проверили это на нескольких компьютерах и, по-видимому, на некоторых компьютерах результат одного сна действительно составил 1 мс. На других ПК это было 0,0156 секунд.

Затем, внезапно, через некоторое время время сна упало до 0,01 секунды, а затем через час вернулось к 0,001 секунде (1 мс).

Это нормальное поведение в Windows? Является ли Windows «сонным» в первые часы после перезагрузки, а затем постепенно приобретает более высокий уровень детализации сна через некоторое время? Или есть другие аспекты, которые могут объяснить изменение в поведении?

Во всех моих тестах ни одно другое приложение не работало в одно и то же время (или: по крайней мере, не занимая ни одного процессора).

Есть идеи?

ОС - Windows 7.

Ответы [ 6 ]

6 голосов
/ 26 октября 2010

Я не слышал о том, чтобы разрешение прыгал само по себе, но в целом разрешение Sleep следует за тактом планировщика задач. Поэтому по умолчанию это обычно 10 или 15 мс, в зависимости от редакции Windows. Вы можете установить его вручную на 1 мс, введя timeBeginPeriod .

2 голосов
/ 26 октября 2010

Я предполагаю, что это планировщик. Каждая ОС имеет определенную степень детализации. Если вы попросите его сделать что-то более низкое, результаты не будут идеальными. Задавая время для сна 1 мс (особенно часто), планировщик может решить, что вы не важны и хотите ли вы спать дольше, или ваш сон может подойти к концу вашего временного интервала.

Вызов в спящем режиме - это консультативный звонок. Он сообщает операционной системе, что вы хотите поспать некоторое время X. Он может быть меньше X (из-за сигнала или чего-то еще) или может быть больше (как вы видите).

В другом вопросе о переполнении стека есть способ сделать это , но вы должны использовать winsock.

1 голос
/ 13 июля 2012

Я только что написал несколько слов о функции sleep () в теме Сон меньше одной миллисекунды .Характеристики функции sleep () зависят от базового оборудования и настроек интерфейса мультимедийного таймера.

Обновление окон может изменить поведение, т. Е. Windows 7 работает по-другому, по сравнению с Vista.Смотрите мой комментарий в этой теме и его ссылки, чтобы узнать больше о функции sleep ().

1 голос
/ 26 октября 2010

Когда вы вызываете Sleep, процессор останавливает этот поток до тех пор, пока он не сможет возобновить время> = к вызываемому времени Sleep.Иногда из-за приоритета потока (который в некоторых случаях приводит к тому, что Sleep (0) приводит к зависанию вашей программы на неопределенное время), ваша программа может возобновить работу позже, потому что больше циклов процессора было выделено для работы другого потока (в основном потоки ОС имеют более высокий приоритет)).

0 голосов
/ 11 июня 2015

Детализация сна Windows обычно составляет 16 мсек, вы получите это, если ваша или какая-либо другая программа не изменит это. Когда вы получаете гранулярность 1 мс в другие дни и 16 мс в другие дни, другая программа, вероятно, устанавливает интервал времени (также влияет на вашу программу). Я думаю, что мой Labview, например, делает это.

0 голосов
/ 26 октября 2010

Скорее всего, таймер сна не имеет достаточного разрешения.

Какое разрешение вы получаете, когда вызываете функцию timeGetDevCaps , как описано в документации к функции Sleep?

...