2010-03-28 13 views
5

Greets-Java zmniejszyć zużycie procesora

Mamy gots kilka nutters w pracy, którzy korzystają z użyciem

while(true) { //Code } 

w swoim kodzie. Jak możesz sobie wyobrazić, maksymalizuje to procesor. Czy ktoś wie, jak zmniejszyć wykorzystanie procesora, aby inne osoby mogły również korzystać z serwera.

Sam kod jest po prostu stale odpytywaniem Internetu w poszukiwaniu aktualizacji na stronach. Dlatego wyobrażam sobie, że metoda "krótkiego snu" znacznie zmniejszyłaby zużycie procesora.

Czy wszystkie manipulacje są wykonywane w obiektach String (Java), czy ktoś wie, ile StringBuilders zmniejszyłoby przekroczenie?

Dzięki za wszelkie wskazówki

+4

'while (true)' jest po prostu idiomem mówiącym "rób to na zawsze". Sam w sobie nic nie robi; kod w nim jest tym, co pochłania cykle procesora. Jeśli kod wewnętrzny wysyła żądania sieciowe, to gdy to zrobi, zrezygnuje z czasu, więc inni użytkownicy dostaną swoje; "sleep()" nie powinno znacząco wpłynąć na ogólną przepustowość serwera (chociaż byłoby to miłe dla serwerów, które dostały się do programu). I wreszcie, 'StringBuilder' może lub (co bardziej prawdopodobne) nie może poprawić wydajności. Ale właśnie dlatego istnieje profiler: mogą powiedzieć, co zajmuje najwięcej czasu w programie. – kdgregory

+3

Jak zawsze uruchom profilera, aby określić, gdzie działa procesor. Następnie wykorzystaj te dane, aby pokonać odpowiedzialnego programistę. –

+0

Jaki system operacyjny? –

Odpowiedz

6

zacznę się ze swoim drugim pytaniu, chciałbym zgodzić się z resztą, że StringBuilder vs ciąg jest bardzo uzależnione od szczególnych manipulacji smyczkowych. "Porównywano" to raz i ogólnie mówiąc, ilość nowych przydziałów ciągów wzrosła (zwykle w postaci konkatenacji), a ogólny czas realizacji wzrastał. Nie będę wchodził w szczegóły i po prostu powiem, że StringBuilder okazał się najskuteczniejszy w nadgodzinach, w porównaniu do String, StringBuffer, String.format(), MessageFormat ...

Moja zasada jest taka, że ​​ilekroć ja chciałbym połączyć więcej niż 3 ciągi razem Zawsze używam StringBuilder.

Co do pierwszego pytania. Musieliśmy wprowadzić zużycie procesora do 5%. To niełatwe zadanie. Użyliśmy mechanizmu Spring AOP, aby dodać Thread.sleep() przed wykonaniem jakiejkolwiek metody intensywnej CPU. Funkcja Thread.sleep() byłaby wywoływana tylko w przypadku przekroczenia pewnego limitu. Przykro mi to mówić, że obliczenie tego limitu nie jest takie proste. I jeszcze bardziej żałuję, że nie otrzymałem pozwolenia na opublikowanie go w sieci. Jest to po to, aby umieścić Cię na interesującym, ale skomplikowanym utworze, który z czasem okazał się skuteczny.

+2

Jakie możliwe rozumowanie może prowadzić do wymagania "nie więcej niż 5% czasu procesora"? Jeśli masz zadanie wymagające dużej mocy obliczeniowej, masz zadanie wymagające dużego obciążenia procesora. Nie da się tego obejść, a dodanie kodu do uśpienia powoduje, że zadanie to trwa dłużej. Jeśli obawiasz się wpływu określonego programu na ogólne zasoby systemowe, znacznie bardziej inteligentne jest po prostu zmniejszenie priorytetu tego programu. Lub kup inny komputer. – kdgregory

+1

Osobiście nie mogłem się z Wami zgodzić! Jednak jestem tylko zwykłym programistą i nie "konstruowałem" tego rozwiązania. Chodzi mi tylko o to, że tego typu rzeczy MOGĄ być zrobione, jeśli zajdzie taka potrzeba :) – Yaneeve

+0

@Yaneeve .. Za późno, żeby o to zapytać. W jaki sposób zarządzałeś kompromisem między szybkością a wykorzystaniem procesora? Jestem pewien, że sen miał wpływ na wydajność, ponieważ wydłużał czas wykonania. – bluelurker

2

Zrób to poczekać trochę czasu przed wypalaniem znowu tak:

while(true) { 
    //Code 
    Thread.sleep (1000); //Wait 1 second 
} 

Jeśli chodzi o drugie pytanie, to zmniejszyć pamięć i ewentualnie użycie procesora, jak również, ale zyski naprawdę zależą od tego, co dzieje się z tymi strunami.

4

Jak często te witryny są aktualizowane? Prawdopodobnie naprawdę denerwujesz gospodarzy. Po prostu przyklej Thread.sleep(60 * 1000); na końcu pętli i możesz tego uniknąć. To będzie odpytywać ich raz na minutę - na pewno to wystarczy?

2

Uśpienie zmniejszyłoby zużycie procesora. Jeśli chodzi o StringBuilders, mogą obniżyć zużycie pamięci i poprawić wydajność.

0

Można również spróbować

Thread.yield() 
+3

@Helper Method - "Yield" powoduje tylko tymczasowe wykonanie aktualnie wykonywanego obiektu wątku wstrzymaj i zezwól na uruchamianie innych wątków ... co znacznie ograniczy użycie procesora, jeśli inne aplikacje będą działać równolegle. "Sen" będzie bardziej adekwatny do tego, co chce osiągnąć. – XpiritO

+0

@XpritO Sry, masz rację. Niezupełnie zrozumiałem punkt PO.Może nie powinienem czytać postu przed moją drugą kawą^^. – helpermethod

+0

to jest powód 5% obciążenia procesora, aby dać innym aplikacjom przestrzeń do "oddychania" na tym samym komputerze i można to osiągnąć poprzez umieszczenie Thread.yield() w krytycznych miejscach kodu. Robię to i jest to bardzo przydatne od punktu normalnego użytkowania oprogramowania .. –

7

Wiele "mądrości ludowej" o StringBuilder jest niepoprawne.Na przykład, zmieniając w ten sposób:

String s = s1 + ":" + s2 + ":" + s3; 

do tego:

StringBuilder sb = new StringBuilder(s1); 
sb.append(":"); 
sb.append(s2); 
sb.append(":"); 
sb.append(s3); 
String s = sb.toString(); 

prawdopodobnie nie pozwoli przejść szybciej. Wynika to z faktu, że kompilator Java faktycznie tłumaczy sekwencję konkatenacji na równoważną sekwencję dołączeń do tymczasowego obiektu StringBuilder. Dopóki nie łączymy łańcuchów w pętli, lepiej po prostu użyć operatora +. Twój kod będzie łatwiejszy do odczytania.

Inną kwestią, którą należy zrobić, jest użycie profilera w celu zidentyfikowania miejsc w kodzie, które mogłyby odnieść korzyści z pracy w celu poprawy wydajności. Większość intuicji programistów na temat tego, co warto zoptymalizować, nie jest niezawodna.

0

Jeśli ich kod jest w oddzielnym JVM i działa na Linux lub innego systemu Unix, wymaga od nich, aby uruchomić swój program w ładnym 20.

Albo można je uruchomić wewnątrz maszyny wirtualnej VirtualBox jak i użytkowania ogranicza to wykorzystanie procesora.

Albo możesz je wystrzelić, jeśli będą kontynuować takie cykle nagrywania zamiast korzystać z modelu sterowanego zdarzeniami lub Thread.sleep.

0
  1. Co witryn jest odpytywanie kodu? Czy obsługują funkcję RSS?
  2. Jeśli tak, to nie ma potrzeby, aby sondować witryny, a zamiast tego podłączyć moduł , aby czekać na aktualizacje. Aktualna metoda następnie oczekuje przy użyciu wait();
  3. Nowy moduł następnie powiadamia obiekt za pomocą tej metody przy użyciu notifyAll().
  4. Wprawdzie jest to dodatkowa praca, ale oszczędza ona dużo przepustowości i obliczeń.
Powiązane problemy