Energooszczędny sleep()
Nigdy nie przywiązywałem dużej wagi do funkcji sleep()
. Kiedy uczyłem się programować, jeszcze na początku 2000ch, wydawał mi się to trochę relikt czasów kiedy prcesory były jednordzeniowe i jednowątkowe, a OS nie dawał zaawansowanego mierzenia czasu. Wtedy, zwłaszcza w grach, ten sleep był potrzebny, żeby program nie działał zbyt szybko. Oczywiście używałem go tu i ówdzie, żeby obejść jakiś błąd, albo w skryptach, które coś robią co określoną ilość czasu (żeby uniknąć zbyt częstego tworzenia nowych procesów).
Ostatnio byłem zaskoczony, jak jeden sleep()
(a własciwie jego mikrosekundowa wersja usleep()
) potrafi zrobić wielką różnicę. Mianowicie rozwijam sobie menedżer okien (fork DWM). Oczywiście jest pętla komunikatów, gdzie w nieskończonej pętli, używane są wołania XPending()
i XNextEvent()
, do pobierania zdarzeń okien. Natomiast ja dodałem jeszcze dodatkowy interfejs przez potok, wiec do tej pętli doszedł jakiś poll()
, który dodatkowo sprawdza czy w potoku coś się nie pojawiło. Taka zmiana spowodowała jednak, że program zaczął non-stop używać 100% procesora i znacznie większe zużycie prądu. Należało właśnie zrobić usleep(50000)
(czekaj 0.05s) na końcu tej pętli i to naprawiło problem, a bateria trzyma 5h (tak jak wczęśniej trzymała 2h). Moim zdaniem wynik dość imponujący jak na taki mały szczegół. :)
Wrzucam zapowiedź podcastu z Konradem Kokosa o pamięci ...tej komputerowej ;)
W kilku słowach Konrad opowiada o odczycie sekwencyjnym i o tym, że jak sobie pościelisz tak się wyśpisz - tłumacząc: jak poukładasz obiekty w pamięci tak będzie szybko działać... jakoś tak ;)
Pełna publikacja w poniedziałek na https://devsession.pl
#podcast #programowanie #performance #wydajnosc
@elwis: Ameryki nie odkryłeś. Jak nie dasz oddychać prockowi, to wiadomo że zrobi 100%. Taki
sleep()
to dosyć standardowa technika, i to nie tylko w grach. Jak tworzę aplikacje które wykonują operacje na dużych plikach i nie dodamsleep()
na microsekundę to też je 100% procesora.