[RISOLTO] CPU Time?

giuscri
Stiamo dando un'occhiata all'efficienza degli algoritmi e durante la prima lezione relativa a questo argomento viene mostrato il programma che segue.

Il codice seguente è relativo ad una procedura per calcolare i primi 1000 numeri primi; verrà poi stampato quanti wall_seconds (?) e quanti cpu_seconds (?) sono passati dall'inizio alla fine del calcolo.

La cosa che mi disturba però è che la percentuale di CPU utilizzata (?) sia pari al rapporto fra cpu_seconds e wall_seconds (x100). Non so, mi sarei aspettato che la percentuale di CPU utilizzata venisse calcolata in un qualche altro modo, ma invece che roba è? Perché è una questione di tempi? :roll:


// ...

int
main(int argc, char *argv[])
{
  
  timeval tv_begin,tv_end;
  clock_t clk_begin,clk_end;

  // Start stopwatch.
  gettimeofday(&tv_begin, NULL);
  clk_begin = clock();

  // Compute, print and destroy the first 1000 prime numbers.
  {
   PrimeNumbers pn(1000); 
   // where pn() is a PrimeNumbers-container constructor -class already defined;
   // that calculates the first 1000 primes.
   std::cout << pn; 
   // where std::cout << pn prints every single primes
   // contained in pn.
  }
  
  // Stop stopwatch
  gettimeofday(&tv_end, NULL);
  clk_end = clock();

  // Compute results
  float wall_seconds, cpu_seconds;
  wall_seconds = static_cast<float>(tv_end.tv_sec - tv_begin.tv_sec) +
                 static_cast<float>(tv_end.tv_usec - tv_begin.tv_usec)/
                 static_cast<float>(1000000);

  cpu_seconds = static_cast<float>(clk_end - clk_begin)/ 
                static_cast<float>(CLOCKS_PER_SEC);

  std::cout << wall_seconds << " wall seconds and " << cpu_seconds
            << " cpu seconds have elapsed." << std::endl;

  float cpu_percentage = cpu_seconds/wall_seconds*100;

  std::cout << "The CPU usage was " << cpu_percentage << "%" << std::endl;

  return 0; 
}

Risposte
claudio862
Se l'esecuzione dura 10 minuti (Wall clock) e il tempo che la CPU ha dedicato al tuo processo è stato di 7 minuti (CPU clock) vuol dire che la CPU è stata impegnata (dal tuo processo) per il 70% del tempo. Il restante 30% lo ha dedicato ad altri processi nel sistema, oppure era in idle.
Nota che anche se il tuo processo è l'unico attivo la percentuale potrebbe essere inferiore al 100%, ad esempio se leggi un carattere da tastiera il tuo processo viene interrotto finché l'utente non schiaccia un tasto; oppure se leggi un file da disco le operazioni di IO sono molto più lente della CPU (questo vale anche per la stampa su schermo, in una funzione computazionalmente intensiva non stampare niente con cerr, né con cout + endl).

giuscri
"claudio86":
Se l'esecuzione dura 10 minuti (Wall clock) e il tempo che la CPU ha dedicato al tuo processo è stato di 7 minuti (CPU clock) vuol dire che la CPU è stata impegnata (dal tuo processo) per il 70% del tempo. Il restante 30% lo ha dedicato ad altri processi nel sistema, oppure era in idle.
Nota che anche se il tuo processo è l'unico attivo la percentuale potrebbe essere inferiore al 100%, ad esempio se leggi un carattere da tastiera il tuo processo viene interrotto finché l'utente non schiaccia un tasto; oppure se leggi un file da disco le operazioni di IO sono molto più lente della CPU (questo vale anche per la stampa su schermo, in una funzione computazionalmente intensiva non stampare niente con cerr, né con cout + endl).


Ora capisco! Grazie mille (come al solito, anche per gli utilissimi suggerimenti gratis). :wink:

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.