2011-11-27 4 views
5

Mam zadanie, które chcę uruchomić w kółko. Chcę wywołać to tak szybko, jak to możliwe, jednak chcę, aby moje cykle procesora były niskie. Czytałem, że korzystanie ze snu w pracy w tle nie jest najlepszym wyborem. Jednak bez snu mój procesor zachowuje około 55% procent. Poniżej mam przykład mojego źródła. Jeśli sen jest odpowiedni, to w jaki sposób wybierasz najlepszy czas na sen, jak widzisz na podstawie moich wyników poniżej, otrzymuję różne wyniki w zależności od tego, jak długo śpię. Czy ktoś może dać mi znać, co najlepsze praktyki jest, gdy robi coś podobnegoPraca w tle Uśpienie w celu zmniejszenia CPU

BackgroundWorker _Worker = new BackgroundWorker() 
{ 
    WorkerReportsProgress = true, 
    WorkerSupportsCancellation = true 
}; 

void Worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // do my task here 

    // if i uncomment one of the Sleep below I reduce the CPU like so 
    // no sleep    CPU = 52-58% 
    // Thread.Sleep(1);  CPU = 09-15% 
    // Thread.Sleep(10); CPU = 02-03% 
    // Thread.Sleep(100); CPU = 00-01% 
} 

void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled) { return; } 

    _Worker.RunWorkerAsync(); 
} 
+0

W zależności od tego, jak go używasz, może być bardziej odpowiedni zegar. –

+0

Myślałem o czasomierzu, ale moje zadanie trwa od 5 sekund do 5 minut, więc pomyślałem, że osoba pracująca w tle będzie lepszym wyborem. – poco

+2

Dlaczego niepokoi Cię CPU%? Być może wprowadzenie go w wątku o niższym priorytecie byłoby bardziej odpowiednie, jeśli chcesz, aby reszta systemu pozostała responsywna. –

Odpowiedz

1

Dzięki wielowątkowości, to wspólne dzieło ustawić tło z niższym priorytetem, jeśli nie chcą spożywać maszynę. Wykorzysta to, co pozostało z CPU. Oznacza to, że nie powinieneś przejmować się, czy osiągnie 100%.

Ale problem z BackgroundWorker polega na tym, że nie można ustawić priorytetu.

Inną opcją jest odrodzenie własnego wątku, w którym można ustawić priorytet.

Oto kolejny związane SO postu:

.NET Backgroundworker Object's Thread Priority

Również inny (prawdopodobnie mniej przyciąga) rozwiązaniem jest umieszczenie ciężką pracę w innym procesie i sprawiają, że bieg niski priorytet. Jeśli nie musisz komunikować się z wieloma postępami, jest to proste. W przeciwnym razie otwarcie kanału komunikacyjnego jest bardziej skomplikowane.

How do I launch a process with low priority? C#

0

Nadawanie tła wątku niższy priorytet zapewni Twój przetwarzanie nie kolidować z innymi funkcjami (tylko dać mu wystarczająco niski priorytet). Czy jest to dla ciebie rozwiązanie? Chcesz, aby praca w tle działała nieprzerwanie. Być może bieganie powoli nie jest dla ciebie dobrą opcją?

Co to jest naprawdę próbujesz osiągnąć?

1

Deterministyczne spanie to nie najlepsza optymalizacja, którą można zastosować w większości scenariuszy (jest to po prostu przypadkowa liczba w twoim przypadku, a nie idealna optymalizacja, którą możesz mieć), najlepszym wyborem jest rather wait and signal. Na razie możesz spróbować obniżyć priorytet wątku, ale zdecydowanie zaleciłbym, aby uzyskać najlepszy parametr oczekiwania i sygnału w zakresie wykorzystania i niezawodności.