Domanda

EDIT:

Vorrei ringraziare tutti voi per la rapida risposte ^^ sonno () funziona come previsto e la mia CPU non viene brutalmente divorato da questo programma più! Terrò questa domanda come è, ma per far sapere a tutti che il problema della CPU è stata risolta speditamente e professionale: D

Per inciso per la parte, mi sarà certamente fare in modo che micro-ottimizzazioni sono ridotte al minimo di fronte a grandi problemi, più importante!

=============================================== =================================

Per qualche motivo il mio programma, una sveglia console che ho fatto per le risate e la pratica, è estremamente impegnativo per la CPU. Si consuma circa 2MB di RAM, che è già un bel po 'per tale un piccolo programma, ma devasta la mia CPU con oltre 50 risorse%, a volte.

La maggior parte del tempo il mio programma sta facendo nulla se non contando i secondi, quindi credo che questa parte del mio programma è quello che sta causando così tanto dura prova il mio CPU, anche se non so perché. Se è così, la prego di raccomandare un modo di fare IT meno , o forse una libreria da usare al posto se il problema non può essere facilmente risolto?

/* The wait function waits exactly one second before returning to the *
 * called function.                                                   */     
 void wait( const int &seconds )
 {
 clock_t endwait; // Type needed to compare with clock()
 endwait = clock() + ( seconds * CLOCKS_PER_SEC ); 

 while( clock() < endwait ) {} // Nothing need be done here.
 }

Nel caso in cui qualcuno naviga CPlusPlus.com, questa è una vera e propria copia / incolla della funzione orologio () hanno scritto come esempio per l'orologio (). Gran parte il motivo per cui il commento //Nothing need be done here è così poco brillante. Non sono del tutto sicuro di cosa esattamente orologio () fa ancora.

Il resto del programma chiama altre due funzioni che si attivano solo ogni sessanta secondi, altrimenti il ??ritorno al chiamante e il conteggio giù un altro secondo, quindi non credo che sia troppo CPU intensive- anche se non saprei, questo è il mio primo tentativo di ottimizzazione del codice.

La prima funzione è una console chiara utilizzando system("cls") che, lo so, è molto, molto lento e non è una buona idea. Sarò cambiando quel post-fretta, ma, dal momento che si attiva solo ogni 60 secondi e c'è un notevole ritardo-picco, so che questo non è il problema il più delle volte.

La seconda funzione ri-scrive il contenuto dello schermo con il tempo rimanente aggiornato anche solo ogni sessanta secondi.

I modificherà nella funzione che le chiamate aspettare, ClearScreen e display se è chiaro che questa funzione non è il problema. Ho già provato a fare riferimento la maggior parte delle variabili in modo che non vengono copiate, così come evitare endl come ho sentito che è un po 'lento rispetto al \n.

È stato utile?

Soluzione

Questa:

while( clock() < endwait ) {} 

Non è "far niente". Di certo non si fa nulla all'interno il ciclo while, ma il test di clock() < endwait non è libero. In realtà, viene eseguito più e più volte veloce come il sistema può eventualmente gestire farlo, che è ciò che sta guidando il vostro carico (probabilmente il 50% perché si ha un processore dual core, e questo è un programma single-threaded che può usare un solo core).

Il modo corretto per farlo è solo per questo cestino intera funzione wait, e invece solo l'uso:

sleep(seconds);

che effettivamente fermare il vostro programma di eseguire per il numero specificato di secondi, e non consuma il tempo del processore, mentre farlo.

A seconda della piattaforma, sarà necessario includere sia <unistd.h> (UNIX e Linux) o <windows.h> (Windows) per accedere a questa funzione.

Altri suggerimenti

Questo è chiamato un busy-wait. La CPU è in rotazione le ruote a tutto gas nel ciclo while. È necessario sostituire il ciclo while con una semplice chiamata al sleep o usleep.

Non so circa il 2 MB, soprattutto senza sapere nulla circa il programma complessivo, ma che non è davvero qualcosa da sottolineare fuori sopra. Potrebbe essere che le librerie di runtime C succhiano più di tanto in fase di start-up per ragioni di efficienza.

Il problema della CPU è stato risposto bene. Per quanto riguarda il problema di memoria, non è chiaro cosa 2 MB è effettivamente misurando. Potrebbe essere la dimensione totale di tutte le biblioteche mappati nello spazio degli indirizzi del dell'applicazione.

Esegui e controllare un programma che semplicemente contiene

int main() { for (;;) }

per misurare l'utilizzo della memoria di base sulla vostra piattaforma.

Non Sei filatura senza cedere qui, quindi non è una sorpresa che si bruciano cicli di CPU.

Goccia a

  Sleep(50);

nel ciclo while.

Il ciclo while sta tenendo il processore occupato ogni volta che il filo diventa un timeslice da eseguire. Se tutti si desidera è di aspettare per un determinato periodo di tempo, non hai bisogno di un ciclo. È possibile sostituirlo con una singola chiamata a sleep, usleep o nanosleep (a seconda della piattaforma e la granularità). Essi sospendere l'esecuzione thread fino a quando la quantità di tempo specificato è trascorso.

In alternativa, si può proprio rinunciare (yield) sul timeslice rimanente, chiamando Sleep(0) (Windows) o sched_yield() (Unix / Linux / etc).

Se si vuole capire il motivo esatto per questo problema, leggere su pianificazione .

mentre (clock ()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top