2010-11-08 12 views
6

Mam aplikację wielowątkową C#, w której główna logika znajduje się w module obsługi zdarzenia Timer.Elapsed. Obsługa zdarzeń zawiera pętle o rozmiarze 2 for, która wykonuje maksymalnie n * n = 5 * 5 = 25 times.Aplikacja C# - Zmniejszenie wykorzystania procesora

Aplikacja działa dobrze na moim komputerze. Przebiegłem VS 2010 Profiler ze średnią używanej aplikacji i procesora pod adresem 20%.

tester Firma twierdzi, że na swoim komputerze to przeskakuje między 50% i 100% na swoim komputerze. Powoduje to problemy z wydajnością.

  • Czy jest coś, co mogę zrobić, aby temu zaradzić?
  • Co naprawdę oznacza wysokie użycie procesora?
  • Czy to może mieć wpływ na jego komputer?
  • Czy można powiedzieć aplikacji, aby wykorzystała tylko X ilość procesora ?

Każda pomoc zostanie doceniona.

+0

Liczba operacji wykonywanych w pętli oznacza tylko kontekst w stosunku do wykonywanej operacji. Jeśli wykonasz kosztowną operację 25 razy, to może być duży problem. Jeśli sumujesz do 25, nie będzie to miało znaczenia. – rerun

+0

Jak często strzelasz z timera? Czy czekasz, aż operacja zostanie zakończona przed ponownym uruchomieniem timera, czy po prostu wciąż zaczynasz od nowa, bez względu na to, czy poprzednia zakończyła się? –

+0

Zegar wykonuje co sekundę. W procedurze obsługi zdarzeń zegara zatrzymuję timer w pierwszym wierszu kodu i ponownie uruchamiam go w ostatnim wierszu kodu. W efekcie tworzy się 1 sekundowe opóźnienie między zdarzeniami. Kod pomiędzy uruchomieniem i zatrzymaniem stopera, wykonuje niektóre obliczenia w pamięci na ConcurrentDictionary, które mogą znacznie wzrosnąć. Obliczenia są dość proste, ale opierają się na dużych ilościach danych. W tej procedurze obsługi zdarzeń nie ma interakcji z interfejsem użytkownika, dlatego nie używam narzędzia DispatcherTimer ani BackgroundWorker. ConcurrentDictionary jest aktualizowany przez różne zdarzenia. – c0D3l0g1c

Odpowiedz

3

Jesteś w zastanawiałem i tryb przypuszczający. Zapomnij o procentach procesora. Co robią profesjonaliści, to dowiedzieć się, dlaczego program spędza czas i czy jest to konieczne.

To, co możesz zrobić, to po prostu uruchomić ten kod w długiej pętli i wypróbować go. I use this method. Próbki stosu wylądują preferencyjnie w ciężkich gałęziach drzewa wywołań. Szanse są na pozbycie się niektórych ciężkich gałęzi i uzyskanie szybkiego przyśpieszenia.

+0

Zobacz moje komentarze powyżej. – c0D3l0g1c

+0

@ c0D3l0g1c: Oto kwestia użycia procesora. CPU zawsze wykonuje. Kiedy nie wykonuje prawdziwego kodu, wykonuje on proces bezczynności. Użycie to krótkoterminowa średnia czasu spędzonego w prawdziwym kodzie. Podczas gdy twój proces czeka na I/O, nie działa, więc pokazuje się jako mniejsze użycie. Jeśli to jest chrupanie, jest wyższe. Ma niewiele wspólnego ze skutecznością kodu. Najważniejsze, co powiedziałem. Zasadniczo wyciągnij wyprowadzkę, znajdując ciężkie gałęzie drzewa wywołań, które możesz przyciąć. –

+0

Dzięki, ma sens! Twój artykuł z poprzedniego postu jest przydatny. – c0D3l0g1c

6
  • prowadzony zdarzenie timera rzadziej
  • wykonywać pracę na wątku roboczego (więc UI jest co najmniej czuły)
  • zrobić mniej pracy w zegarze (lub zrobić to bardziej efektywnie)
  • uzyskaj więcej CPU

Zgaduję, że naprawdę masz na myśli trzecią kulę, ale nie możemy odpowiedzieć na to pytanie, nie wiedząc, co robi kod; ale (Random sugestii bez jakiegokolwiek kontekstu):

  • wygląd w każdej dostępu zbiórki, aby zobaczyć czy jest tam miejsce dla słowniku, hash-set, lub podobny check
  • jeśli robi ogromne ilości IO (w szczególności do DB), który może zostać zmniejszona
  • sprawdzić, czy masz zamiar dużo nitki przełączników poprzez Invoke (lub równowartość w interfejsie użytkownika)
+0

Zobacz komentarze powyżej. – c0D3l0g1c

1

po prostu dodaj Thread.Sleep(1); do pętli for. to stabilizuje użycie procesora i ogranicza użycie procesora z maksymalną prędkością.

0

Może być Twoja aplikacja uruchamia wiele wątków. Mam ten sam problem, który uruchamia wiele wątków, aw każdym wątku jest ciągła aktualizacja, która sprawia, że ​​użycie aplikacji od 50% do 100%.

Po zbadaniu problemu, właśnie wprowadziłem opóźnienie w ciągłej pętli wątku (wątek (100)). Powoduje to przywrócenie aplikacji do wartości 1% do 3%.

Powiązane problemy