2016-07-18 11 views
8

Ostatnio byłem surfowanie na przepełnienie stosu (Python) i zobaczył this post gdzie Aaron Hall twierdzi, żeCzy time.sleep pomaga procesorowi?

stale działa natomiast pętle mogą zużywać dużo mocy obliczeniowej. Dodanie okresu snu (nawet tylko sekundy) może znacznie zmniejszyć to zużycie.

Czy to naprawdę prawda? A jeśli tak, to dlaczego? Czy ta sama reguła dotyczy również innych języków programowania (np. C++)?

+2

Dodanie snu w pętli zwykle oznacza problem z logiką programu, ale tak, to pomaga złemu kodowi. – NathanOliver

+0

Co jeśli chcesz, aby program działał wiecznie, czekając na przerwanie? Czy istnieje lepsza alternatywa? – dashiell

+1

Jeśli pętla while służy tylko do oczekiwania na zdarzenie zewnętrzne, musi zostać zastąpiona przez narzędzie wielowątkowe przeznaczone do oczekiwania na zdarzenie. Jeśli jest to odpytywanie dysku dla pliku, a następnie spać, sprawdź, czy jest to najlepsza opcja. Ale po prostu wypalanie rzeczywistych instrukcji procesora, takich jak while (true), dotyczy najgorszego możliwego sposobu oczekiwania na zdarzenie. Czy jest lepszy sposób ... zależy od tego, na jakie wydarzenie jest to, na co czekasz. –

Odpowiedz

8

TL; DR Jeśli odpytywanie dotyczy zdarzenia, które ma miejsce raz na minutę, możesz nie sprawdzać co nano sekundę.

Tak, to prawda. Spanie w wątku zmniejsza użycie procesora w tym wątku. Podczas gdy wątek śpi, prawie nie zużywa czasu procesora.

Tak, dotyczy to w dużej mierze dowolnego języka, o ile funkcja uśpienia jest zaimplementowana za pomocą interfejsu API macierzystego systemu operacyjnego.

Aby myśleć o tym intuicyjnie, rozważmy uproszczoną wersję programu z połączonego pytanie:

while end_condition_expression: 
    if time_based_condition_expression: 
     do_something() 

Teraz, niech nam uprościć świat, i zakładamy, że program jest tylko proces uruchomiony na procesor.

Załóżmy również, że warunek oparty na czasie jest prawdziwy raz na minutę. Załóżmy także, że wykonanie end_condition_expression i time_based_condition_expression kosztuje 10 nano sekund czasu procesora.

Ile czasu procesora zużyje w ciągu minuty? Dokładnie jedna minuta == 60 000 000 000 nano sekund. Wykorzystanie procesora będzie w 100% przez cały czas. Pętla będzie powtarzana sześć miliardów razy.

Teraz rozważyć ten wariant programu:

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

Ile razy będzie pętla zostały wykonane w ciągu minuty? 60 iteracji. Ile czasu procesora zużyje w ciągu minuty? 60 * 10 ns = 600 ns. Jest to sto milionowa część, z której korzystała nie-sypialna wersja programu.

W rzeczywistości jest trochę sensu z wezwania do spania, a czas procesora jest współdzielony z innymi procesami, a harmonogram jest zaangażowany, a dokładne użycie procesora nie będzie dokładnie pasować do moich założeń, ale idea pozostaje taka sama.

Powiązane problemy