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.
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
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ę? –
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