2012-05-09 25 views
9

Me gustaría medir el tiempo del sistema que se necesita para ejecutar algún código. Para ello sé que me sándwich de dicho código entre dos llamadas a getrusage(), pero me da algunos resultados inesperados ...Obtener getrusage() para medir el tiempo del sistema en 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; 
} 

espero que esto produce dos números diferentes, pero por desgracia! Después de ver a mi equipo piensa por un segundo o dos, este es el resultado:

Started at: 0.1999s 
Ended at: 0.1999s 

Am Not I utilizando getrusage() ¿verdad? ¿Por qué no deberían estos dos números ser diferentes? Si estoy fundamentalmente equivocado, ¿hay alguna otra forma de utilizar getrusage() para medir el tiempo del sistema de algún código fuente? Gracias por leer.

+1

Tenga en cuenta que 'tv_usec' son microsegundos, por lo que su formato debe ser'% lu.% 06u'. – Mapio

Respuesta

9

Está entendiendo mal la diferencia entre el tiempo de "usuario" y "sistema". Su código de ejemplo se ejecuta principalmente en modo usuario (es decir, ejecuta el código de su aplicación) mientras está midiendo, pero el tiempo de "sistema" es una medida del tiempo empleado en ejecutar en modo kernel (es decir, procesar llamadas al sistema).

ru_stime es el campo correcto para medir el tiempo del sistema. Su aplicación de prueba simplemente no acumulará tal tiempo entre los dos puntos que verifique.

+1

¡Gracias! Explicaste esto mejor que mi profesor. –

2

Debe usar usage.ru_utime, que es el tiempo de CPU del usuario utilizado, en su lugar.

+0

Esto de hecho me da resultados más preferibles. Sin embargo, todavía estoy obligado a encontrar una manera efectiva de medir el tiempo del sistema de algún código. ¿Para qué sirve use.ru_stime si no funciona? –

+1

Si el programa está diseñado para ejecutarse en modo kernel, entonces use 'ru_stime'. De lo contrario, use 'ru_utime'. – shinkou

+0

Yo usaría 'clock_gettime' con el reloj de la hora de la CPU ... –

0

Usa gprof. Esto le dará el tiempo necesario para cada función. Instala gprof y utiliza estos indicadores para la compilación -pg -fprofile-arcs -ftest-coverage.

Cuestiones relacionadas