2010-03-28 32 views
5

Greets-Java ridurre l'utilizzo della CPU

Abbiamo gots alcune nutters nel lavoro che godono utilizzando

while(true) { //Code } 

nel loro codice. Come puoi immaginare, questo supera la CPU. Qualcuno sa come ridurre l'utilizzo della CPU in modo che anche altre persone possano utilizzare il server.

Il codice stesso esegue costantemente il polling di Internet per gli aggiornamenti sui siti. Quindi immagino che un piccolo metodo di sleep ridurrebbe di molto l'utilizzo della CPU.

Anche tutte le manipolazioni sono in corso in oggetti String (Java). Qualcuno sa quanto gli StringBuilder potrebbero ridurre l'overhead di?

Grazie per tutti i puntatori

+4

'while (true)' è semplicemente un idioma che dice "fallo per sempre". Di per sé, non fa nulla; il codice al suo interno è ciò che consuma i cicli della CPU. Se il codice all'interno sta facendo richieste di rete, allora si arrenderà il suo timeslice quando lo fa, così gli altri utenti otterranno il loro; un 'sleep()' non dovrebbe influenzare in modo significativo il throughput complessivo del server (anche se sarebbe una cosa carina per quei server che vengono colpiti dal programma). E infine, 'StringBuilder' potrebbe o (più probabilmente) potrebbe non migliorare le prestazioni. Ma questo è il motivo per cui esistono i profiler: possono dirti che cosa impiega più tempo nel programma. – kdgregory

+3

Come sempre eseguire un profiler per identificare dove va la cpu. Quindi utilizzare tali dati per battere lo sviluppatore responsabile in testa. –

+0

Quale sistema operativo? –

risposta

6

Comincerò con la seconda domanda, vorrei essere d'accordo con il resto che StringBuilder vs String è molto dipendente dalle particolari manipolazioni di stringhe. Ho avuto questo "benchmark" una volta e, in generale, dato che la quantità di nuove allocazioni di stringhe è aumentata (di solito sotto forma di concatenazioni) il tempo di esecuzione complessivo è aumentato. Non entrerò nei dettagli e dirò solo che StringBuilder è risultato essere straordinariamente efficiente, rispetto a String, StringBuffer, String.format(), MessageFormat ...

La mia regola generale è che ogni volta che io desidero concatenare più di 3 stringhe insieme uso sempre StringBuilder.

Per quanto riguarda la prima domanda. Avevamo l'obbligo di portare l'utilizzo della CPU al 5%. Non è un compito facile Abbiamo usato il meccanismo AOP di Spring per aggiungere un Thread.sleep() a qualsiasi metodo di esecuzione di un metodo intensivo della CPU. Thread.sleep() viene richiamato solo se è stato superato un limite. Mi dispiace dire che il calcolo di questo limite non è così semplice. E ancora più arrabbiato dire che non ho ancora ottenuto il permesso di postarlo in rete. Quindi questo è solo per metterti su una pista interessante ma complicata che ha dimostrato di funzionare nel tempo.

+2

Quale possibile ragionamento potrebbe portare a un requisito di "non più del 5% del tempo di CPU"? Se si dispone di un task che richiede un uso intensivo della CPU, si ha un task che richiede molta CPU. Non c'è modo di aggirare questo, e l'aggiunta di posti letto al codice rende semplicemente l'operazione più lunga. Se sei preoccupato per l'impatto di un particolare programma sulle risorse complessive del sistema, allora è molto più intelligente ridurre semplicemente la priorità di quel programma. O acquista un altro computer. – kdgregory

+1

Personalmente, non potrei essere più d'accordo con te! Tuttavia, io sono solo un semplice programmatore e non ho "ingegnerizzato" questa soluzione. Il mio unico punto era che questo tipo di cosa potrebbe essere fatto, se necessario :) – Yaneeve

+0

@Yaneeve .. Troppo tardi per chiedere questo. Come hai gestito il compromesso tra velocità e utilizzo della CPU? Sono sicuro che il sonno ha avuto un impatto sulle prestazioni poiché ha aumentato il tempo di esecuzione. – bluelurker

2

Make it attendere qualche tempo prima di sparare di nuovo, in questo modo:

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

Per quanto riguarda la seconda domanda, ridurrebbe la memoria e, eventualmente, l'utilizzo della CPU pure, ma la i guadagni dipendono davvero da cosa sta succedendo con quelle stringhe.

4

Con quale frequenza vengono aggiornati tali siti? Probabilmente stai davvero infastidendo i padroni di casa. Basta attaccare un Thread.sleep(60 * 1000); alla fine del ciclo e puoi evitarlo. Questo li interrogherà una volta al minuto, sicuramente è sufficiente?

2

Una sospensione riduce l'utilizzo della CPU. Per quanto riguarda gli StringBuilder, potrebbero ridurre l'utilizzo della memoria e migliorare le prestazioni.

0

Si potrebbe anche provare

Thread.yield() 
+3

Metodo @Helper - "Rendimento" fa sì che l'oggetto thread attualmente in esecuzione non sia temporaneamente mettere in pausa e consentire l'esecuzione di altri thread ... quindi questo ridurrà in modo significativo l'utilizzo della CPU solo se ci sono altre applicazioni utente in esecuzione in parallelo. "Dormire" sarà più adeguato a ciò che vuole raggiungere. – XpiritO

+0

@XpritO Sry, hai ragione. Non ha proprio capito il punto dell'OP.Forse non dovrei leggere post prima del mio secondo caffè ^^. – helpermethod

+0

è il motivo del 5% del carico della CPU, per dare spazio ad altre app per "respirare" sullo stesso computer, e ciò può essere ottenuto inserendo alcuni Thread.yield() in punti critici del codice. Lo sto facendo ed è molto utile dal punto di vista della normale esperienza di utilizzo del software. –

7

Un sacco di "saggezza popolare" su StringBuilder non è corretto.Ad esempio, la modifica questo:

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

a questo:

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

probabilmente non ce la farà andare più veloce. Questo perché il compilatore Java effettivamente traduce la sequenza di concatenazione in una sequenza equivalente di accodamenti a uno StringBuilder temporaneo. A meno che non si concatenano le stringhe in un ciclo, è preferibile utilizzare l'operatore +. Il tuo codice sarà più facile da leggere.

L'altro punto che dovrebbe essere fatto è che dovresti usare un profiler per identificare i posti nel tuo codice che trarrebbero vantaggio dal lavoro per migliorare le prestazioni. L'intuizione della maggior parte degli sviluppatori su ciò che vale la pena ottimizzare non è così affidabile.

0

Se il loro codice è in una JVM separata ed è in esecuzione su Linux o qualche altro Unix, chiedere loro di eseguire il loro programma a Nizza 20.

Oppure si potrebbe avere correre all'interno di una macchina virtuale come VirtualBox e l'uso per limitare l'utilizzo del processore.

Oppure è possibile licenziarli se continuano a masterizzare cicli del genere anziché utilizzare un modello event-driven o Thread.sleep.

0
  1. Quali siti è il codice di polling? Do supportano una spinta RSS?
  2. In tal caso, non è necessario eseguire il polling dei siti, quindi collegare un modulo per attendere gli aggiornamenti. Il metodo corrente quindi attende utilizzando wait();
  3. Il nuovo modulo quindi notifica l'oggetto con questo metodo utilizzando notifyAll().
  4. Certo, si tratta di un lavoro extra, ma consente di risparmiare un sacco di larghezza di banda e calcoli.
Problemi correlati