Program żre procesor

0

Mój program, który jest w końcowej wersji prac nad nim zużywa 80-90% mocy procesora... To za dużo. Ma chodzić docelowo na wolniejszej maszynie.

Najgorsze jest to, że nie wiem co powoduje tak duże zużycie... Pisałem go w c++, z użyciem bibliotek GTK+, ActiveMQCpp do komunikacji z netem. Pod Linuxa. Wersja release zajmuje 700kB. 3 wątki: główny GTK, wątek komunikujący się z peryferiami (właściwie osobny moduł aplikacji), wątek, który wykonuje czynności zależne od czasu oraz obsługuje komunikację z internetem.

Czy znacie jakieś narzędzia, które umożliwiają zaawansowany debug, który pozwoli dowiedzieć się co żre tyle mocy CPU?

0

http://valgrind.org/docs/manual/cg-manual.html
KCachegrind jest dobrą nakładką graficzną.

0

Prawdopodobnie tzw. aktywne czekanie, czyli gdzieś w pętli czekasz na coś.
Przykładowo takie czekanie na klawisz

while (!kbhit()) ;

pożre 100% czasu procesora.

0

zainstalowałem sobie już valgrinda, zaraz będę testował.

@Azarien: niedobrze :/ mam dużo takich pętli, szczególnie w wątku komunikacji z peryferiami: czekanie na wyzerowanie bitów itp....

teraz trzeba kombinować...

dzięki za odpowiedzi

0
Azarien napisał(a)

Prawdopodobnie tzw. aktywne czekanie, czyli gdzieś w pętli czekasz na coś.
Przykładowo takie czekanie na klawisz

while (!kbhit()) ;

pożre 100% czasu procesora.

ps. da się to jakoś zwalczyć?

0

ja wiem ze wiekszasc watkow sie zaczyna tak

while (!Terminated) {

}

nie wiem ale watki ustawione na thread normal nie zra przynajmniej na viscie tyle procka

0

@rafal__ możesz chciażby robić w tych pętlach sleep jakieś i sprawdzać warunek np. co sekundę.

0
Shalom napisał(a)

@rafal__ możesz chciażby robić w tych pętlach sleep jakieś i sprawdzać warunek np. co sekundę.

dobry pomysł ;) dzięki

0

Nie używałem GTK, ale raczej powinno mieć jakieś eventy/sygnały, na te zdarzenia, na które czekasz!
Najskuteczniej jest mieć standardową pętle przetwarzania zdarzeń i obsługiwać zdarzenia/sygnały odpowiednio.
W ten sposób system cię będzie budził i usypiał wątek odpowiedni do potrzeb. sleep to takie toporne rozwiązanie, które może negatywnie odbić się na szybkości działania twojej aplikacji.

0
rafal__ napisał(a)

ps. da się to jakoś zwalczyć?

Należy korzystać ze zdarzeń, semaforów, i podobnych mechanizmów.
Sleep też działa, ale to półśrodek.

wiem ze wiekszasc watkow sie zaczyna tak
while (!Terminated) {
Dobrze, ale ważne co jest w środku tego wątka: jeśli nie ma nic wstrzymującego wątek (pause, sleep, synchronizacja jakaś) to taki wątek będzie się szybko kręcił w kółko.

Należy się wystrzegać pustych przebiegów jakichkolwiek pętli: jeśli spodziewamy się, że czekanie będzie trwać kilka sekund albo minut, to sprawdzanie flagi kilka miliardów razy na sekundę jest tylko marnowaniem mocy obliczeniowej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1