2012-05-09 7 views
9

Vorrei misurare il tempo di sistema necessario per l'esecuzione del codice. Per fare questo so che sarebbe panino detto codice tra due chiamate a getrusage(), ma ho alcuni risultati inaspettati ...Come ottenere getrusage() per misurare l'ora del sistema in C

#include <sys/time.h> 
#include <sys/resource.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() { 
    struct rusage usage; 
    struct timeval start, end; 
    int i, j, k = 0; 

    getrusage(RUSAGE_SELF, &usage); 
    start = usage.ru_stime; 
    for (i = 0; i < 10000; i++) { 
    /* Double loop for more interesting results. */ 
    for (j = 0; j < 10000; j++) { 
     k += 20; 
    } 
    } 
    getrusage(RUSAGE_SELF, &usage); 
    end = usage.ru_stime; 

    printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec); 
    printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec); 
    return 0; 
} 

Mi auguro che questo produce due numeri diversi, ma ahimè! Dopo aver visto il mio computer pensare per un secondo o due, questo è il risultato:

Started at: 0.1999s 
Ended at: 0.1999s 

Am non ho utilizzando getrusage() giusto? Perché questi due numeri non dovrebbero essere diversi? Se sono fondamentalmente sbagliato, c'è un altro modo di usare getrusage() per misurare il tempo di sistema di qualche codice sorgente? Grazie per aver letto.

+1

Si noti che 'tv_usec' sono microsecondi, quindi il formato dovrebbe essere'% lu.% 06u'. – Mapio

risposta

9

Stai fraintendendo la differenza tra "utente" e "sistema" ora. Il tuo codice di esempio è in esecuzione principalmente in modalità utente (cioè, eseguendo il codice dell'applicazione) mentre stai misurando, ma il tempo "sistema" è una misura del tempo impiegato nell'esecuzione in modalità kernel (ad esempio, l'elaborazione delle chiamate di sistema).

ru_stime è il campo corretto per misurare l'ora del sistema. La tua applicazione di test non si accumula in nessun momento tra i due punti che controlli.

+1

Grazie! L'hai spiegato meglio di quanto avrebbe potuto fare il mio professore. –

2

È necessario utilizzare usage.ru_utime, che è invece il tempo di utilizzo della CPU utilizzato.

+0

Questo effettivamente mi dà risultati più preferibili. Tuttavia, sono ancora obbligato a trovare un modo funzionante per misurare il tempo di sistema di alcuni codici. Qual è l'uso di usage.ru_stime se non funziona? –

+1

Se il programma è progettato per funzionare in modalità kernel, usare 'ru_stime'. Altrimenti, usa 'ru_utime'. – shinkou

+0

Vorrei usare 'clock_gettime' con l'orologio della cpu ... –

0

Utilizzare gprof. Ciò ti darà il tempo impiegato da ciascuna funzione. Installa gprof e usa questi flag per la compilazione -pg -fprofile-arcs -ftest-coverage.

Problemi correlati