2016-07-18 4 views
8

Недавно я был серфинг на переполнение стека (Python) и увидел this post где Аарон Холл утверждает, чтоПомогает ли time.sleep процессору?

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

Действительно ли это так? И если да, то как? То же правило применяется и к другим языкам программирования (т. Е. C++)?

+2

Добавление сна в цикл обычно означает, что есть проблема с логикой программы, но да, это помогает плохому коду. – NathanOliver

+0

Что делать, если вы хотите, чтобы программа работала вечно, пока она ждет прерывания? Есть ли лучшая альтернатива? – dashiell

+1

Если цикл while предназначен только для ожидания какого-либо внешнего события, его нужно заменить каким-то многопоточным инструментом, предназначенным для ожидания события. Если он опросит диск для файла, тогда спят, тогда проверка, вероятно, является лучшим вариантом. Но просто сжигание в действительных инструкциях cpu, таких как while (true), - это самый худший способ дождаться события. Есть ли лучший способ ... зависит от того, какое событие вы ожидаете. –

ответ

8

TL; DR Если вы проводите опрос на событие, которое происходит раз в минуту, вы можете не проверять каждую секунду.

Да, это действительно так. Сон в потоке снижает использование ЦП в этом потоке. Пока поток спит, он почти не потребляет процессорного времени.

Да, это верно для практически любого языка, если спящий режим реализован с использованием собственного API потоковой обработки.

Думать об этом интуитивно, давайте рассмотрим упрощенную версию программы из связанного вопроса:

while end_condition_expression: 
    if time_based_condition_expression: 
     do_something() 

Теперь, давайте упрощать мир, и предположим, что программа является единственным процессом, запущенным на процессор.

Предположим также, что временное условие истинно раз в минуту. Предположим также, что выполнение end_condition_expression и time_based_condition_expression стоит 10 nano секунд времени процессора.

Сколько времени будет потреблять процессор в течение минуты? Ровно одна минута == 60 000 000 000 nano секунд. Использование процессора будет 100% в течение всего времени. Цикл будет повторяться шесть миллиардов раз.

Теперь рассмотрит этот вариант программы:

while end_condition_expression: 
    if time_based_condition_expression: 
     do_something() 
    sleep_for_a_second() 

Сколько раз цикл произведет в течение одной минуты? 60 итераций. Сколько времени процессор будет потреблять в течение минуты? 60 * 10 ns = 600 ns. Это сто миллионная часть того, что использовала не-спальная версия программы.

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

Смежные вопросы