Почему время сна для Sleep (1) кажется переменным в Windows?

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

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

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

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

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

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

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

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

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

Любые идеи?

ОС - Windows 7.


person Patrick    schedule 25.10.2010    source источник
comment
Не могло ли что-то до и после сна (в виде эллипсов) повлиять на результат?   -  person YWE    schedule 26.10.2010


Ответы (6)


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

person 500 - Internal Server Error    schedule 25.10.2010
comment
Ага, вот и все. По-видимому, некоторые приложения меняют степень детализации с 0,0156 секунды (что, кажется, по умолчанию) до 0,001 секунды (может быть Office, Internet Explorer или что-то еще). - person Patrick; 26.10.2010

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

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

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

person MBCook    schedule 25.10.2010

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

person Jesus Ramos    schedule 26.10.2010

Я только что написал несколько слов о функции sleep () в потоке Sleep Less Than One Millisecond. Характеристики функции sleep () зависят от базового оборудования и настройки интерфейса мультимедийного таймера.

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

person Arno    schedule 13.07.2012


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

person Pekka Lehtikoski    schedule 11.06.2015