2009-09-23 95 views
22

Deseo calcular el tiempo en milisegundos tomado por la ejecución de alguna parte de mi programa. He estado buscando en línea, pero no hay mucha información sobre este tema. ¿Alguno de ustedes sabe cómo hacer esto?Cálculo del tiempo transcurrido en un programa C en milisegundos

+0

reetiquetado más acorde con la convención. – dmckee

+1

hm ... no respondí esta pregunta hace una semana: http://stackoverflow.com/questions/1444428/time-stamp-in-the-c-programming-language/1445808#1445808 – Christoph

Respuesta

2

Las bibliotecas C tienen una función que le permite obtener la hora del sistema. Puede calcular el tiempo transcurrido después de capturar las horas de inicio y finalización.

La función se llama gettimeofday() y puede consultar la página de manual para averiguar qué incluir y cómo usarla.

0

En Windows, puede simplemente hacer esto:

DWORD dwTickCount = GetTickCount(); 

// Perform some things. 

printf("Code took: %dms\n", GetTickCount() - dwTickCount); 

No es la solución más general/elegante, pero agradable y rápido cuando lo necesite.

3

La función gettimeofday devuelve el tiempo con una precisión de microsegundos (si la plataforma puede admitir que, por supuesto):

El gettimeofday() la función se obtener la hora actual, expresado como segundos y microsegundos desde la Época, y la almacena en la estructura timeval apuntada por tp. La resolución del reloj del sistema es no especificada.

+1

'gettimeofday' isn No es bueno para medir el tiempo transcurrido entre dos eventos, porque el reloj de la hora del sistema puede cambiarse entre los eventos (por ejemplo, mediante una actualización de NTP o simplemente acción del administrador). (A veces * es * lo mejor disponible, sin embargo). – caf

4

Otra opción (al menos en algunos UNIX) es clock_gettime y funciones relacionadas. Estos permiten el acceso a varios relojes en tiempo real y puede seleccionar uno de los de mayor resolución y descartar la resolución que no necesita.

+1

Particularmente, el reloj 'CLOCK_MONOTONIC', si el sistema en el que se está ejecutando lo admite (' sysconf (_SC_MONOTONIC_CLOCK)> 0'). – caf

34

mejor manera de responder es con un ejemplo:

#include <sys/time.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 

/* Return 1 if the difference is negative, otherwise 0. */ 
int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1) 
{ 
    long int diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec); 
    result->tv_sec = diff/1000000; 
    result->tv_usec = diff % 1000000; 

    return (diff<0); 
} 

void timeval_print(struct timeval *tv) 
{ 
    char buffer[30]; 
    time_t curtime; 

    printf("%ld.%06ld", tv->tv_sec, tv->tv_usec); 
    curtime = tv->tv_sec; 
    strftime(buffer, 30, "%m-%d-%Y %T", localtime(&curtime)); 
    printf(" = %s.%06ld\n", buffer, tv->tv_usec); 
} 

int main() 
{ 
    struct timeval tvBegin, tvEnd, tvDiff; 

    // begin 
    gettimeofday(&tvBegin, NULL); 
    timeval_print(&tvBegin); 

    // lengthy operation 
    int i,j; 
    for(i=0;i<999999L;++i) { 
     j=sqrt(i); 
    } 

    //end 
    gettimeofday(&tvEnd, NULL); 
    timeval_print(&tvEnd); 

    // diff 
    timeval_subtract(&tvDiff, &tvEnd, &tvBegin); 
    printf("%ld.%06ld\n", tvDiff.tv_sec, tvDiff.tv_usec); 

    return 0; 
} 
Cuestiones relacionadas