2010-04-07 15 views
8

Me gustaría saber qué líneas de código C agregar a un programa para que me diga el tiempo total que tarda el programa en ejecutarse. Supongo que debería haber inicialización de contador cerca del principio de main y una después de que la función principal termine. ¿Es el encabezado correcto clock.h?Tiempo transcurrido de ejecución de un programa en C

Muchas gracias ...

Actualizar que tienen una máquina de Windows XP. ¿Está simplemente agregando clock() al principio y otro clock() al final del programa? Entonces puedo estimar la diferencia de tiempo. Sí, tienes razón, es time.h.

Aquí está mi código:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <share.h> 
#include <time.h> 


void f(long double fb[], long double fA, long double fB); 

int main() { 

clock_t start, end; 
start = clock(); 


const int ARRAY_SIZE = 11; 

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE); 

int i; 
long double A, B; 

if (z == NULL) { 
    printf("Out of memory\n"); 
    exit(-1); 
} 

A = 0.5; 
B = 2; 


for (i = 0; i < ARRAY_SIZE; i++) { 
    z[i] = 0; 
} 

z[1] = 5; 

f(z, A, B); 

for (i = 0; i < ARRAY_SIZE; i++) 
    printf("z is %.16Le\n", z[i]); 



free(z); 
z = NULL; 

end = clock(); 
printf("Took %ld ticks\n", end-start); 
printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC); 



return 0; 
} 

void f(long double fb[], long double fA, long double fB) { 
    fb[0] = fb[1]* fA; 
    fb[1] = fb[1] - 1; 
    return; 
} 

Algunos errores con MVS2008:

 
testim.c(16) : error C2143: syntax error : missing ';' before 'const' 
testim.c(18) :error C2143: syntax error : missing ';' before 'type' 
testim.c(20) :error C2143: syntax error : missing ';' before 'type' 
testim.c(21) :error C2143: syntax error : missing ';' before 'type'  
testim.c(23) :error C2065: 'z' : undeclared identifier 
testim.c(23) :warning C4047: '==' : 'int' differs in levels of indirection from 'void *' 
testim.c(28) : error C2065: 'A' : undeclared identifier 
testim.c(28) : warning C4244: '=' : conversion from 'double' to 'int', possible loss of data 

y se dirige a 28 errores. Tenga en cuenta que no tengo ningún error/advertencia sin sus códigos de reloj.

ÚLTIMAS NOTICIAS: Desafortunadamente no recibí una buena respuesta aquí. Pero después de una búsqueda en Google, el código está funcionando. Aquí está:

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


void f(long double fb[], long double fA); 

int main() { 

clock_t start = clock(); 


const int ARRAY_SIZE = 11; 

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE); 

int i; 
long double A; 

if (z == NULL) { 
printf("Out of memory\n"); 
exit(-1); 
} 

A = 0.5; 


for (i = 0; i < ARRAY_SIZE; i++) { 
z[i] = 0; 
} 

z[1] = 5; 

f(z, A); 

for (i = 0; i < ARRAY_SIZE; i++) 
printf("z is %.16Le\n", z[i]); 



free(z); 
z = NULL; 

printf("Took %f seconds\n", ((double)clock()-start)/CLOCKS_PER_SEC); 



return 0; 
} 

void f(long double fb[], long double fA) { 
fb[0] = fb[1]* fA; 
fb[1] = fb[1] - 1; 
return; 
} 

Saludos

actualización el 10 de abril: Aquí hay una solución mejor gracias a "JustJeff"

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 

void f(long double fb[], long double fA); 

const int ARRAY_SIZE = 11; 

int main(void) 
{ 

    long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE); 
    int i; 
    long double A; 

    LARGE_INTEGER freq; 
    LARGE_INTEGER t0, tF, tDiff; 
    double elapsedTime; 
    double resolution; 

    if (z == NULL) { 
    printf("Out of memory\n"); 
    exit(-1); 
    } 
    QueryPerformanceFrequency(&freq); 
    QueryPerformanceCounter(&t0); 
    // code to be timed goes HERE 
    { 
    A = 0.5; 


    for (i = 0; i < ARRAY_SIZE; i++) { 
    z[i] = 0; 
    } 

    z[1] = 5; 
    f(z, A); 


    for (i = 0; i < ARRAY_SIZE; i++) 
    printf("z is %.16Le\n", z[i]); 

    free(z); 
    z = NULL; 

    } 
QueryPerformanceCounter(&tF); 
tDiff.QuadPart = tF.QuadPart - t0.QuadPart; 
elapsedTime = tDiff.QuadPart/(double) freq.QuadPart; 
resolution = 1.0/(double) freq.QuadPart; 
printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart); 
printf("Resolution is %lf nanoseconds\n", resolution*1e9); 
printf("Code under test took %lf sec\n", elapsedTime); 
return 0; 
} 


void f(long double fb[], long double fA) { 
fb[0] = fb[1]* fA; 
fb[1] = fb[1] - 1; 
return; 
} 

Funciona tanto con MVS2008 y con Borland C++ BuilderX de 2003.

+1

Puede publicar una respuesta y aceptarla si cree que ahora tiene la mejor respuesta usted mismo. Hacerlo puede ser útil para otra persona que busca una respuesta a la pregunta en cuestión (y estoy seguro de que otras personas buscan esto todo el tiempo). – Cam

+0

No sé si tengo la respuesta correcta. Pero está funcionando. Siempre recibo sugerencias constructivas ya que todavía estoy aprendiendo. ¿Puedo aceptar (marcar) mi propia respuesta? – yCalleecharan

+0

Sí, puedes. Y, por cierto, no quiero ser grosero, pero ¿cómo no obtuviste una buena respuesta aquí? Tienes un par de buenas respuestas que deberían funcionar. Si obtiene errores, ese es su propio código, no lo que los contestadores le dieron. Si no cree que las respuestas que recibió son buenas, por favor dígale cómo podemos mejorarlas. – Javier

Respuesta

1

Si está en Windows y quiere medir cosas en microsegundos, investigue QueryPerformanceCounter() y QueryPerformanceFrequency(). En muchos sistemas, estos pueden resolver períodos completos de reloj del procesador, el tercero de un nano segundos, y no creo que lo haya visto nunca más grueso que 3.5795MHz, aún muy por debajo de un microsegundo.

Llama a QueryPerformanceFrequency() para determinar cuántos conteos por segundo cuenta el contador. Luego, llame a QueryPerformanceCounter() antes de su código bajo prueba, y luego de nuevo. Delta las dos lecturas de QPC y divida por el período de QPF y obtendrá el tiempo transcurrido entre las dos llamadas de QPC. Al igual que ...

LARGE_INTEGER freq; 
LARGE_INTEGER t0, tF, tDiff; 
double elapsedTime; 
QueryPerformanceFrequency(&freq); 
QueryPerformanceCounter(&t0); 
// code to be timed goes HERE 
QueryPerformanceCounter(&tF); 
tDiff.QuadPart = tF.QuadPart - t0.QuadPart; 
elapsedTime = tDiff.QuadPart/(double) freq.QuadPart; 
// elapsedTime now has your measurement, w/resolution given by freq 

Evidentemente éstas acceden a un dispositivo contador de hardware que está ligado a algún sistema de oscilador en el tablero principal, en cuyo caso no deben sufrir fluctuación de la carga de software. La resolución que obtienes depende de tu sistema.

SEGUIMIENTO

Aquí hay una muy simple programa completo que demuestra la interfaz:

#include <windows.h> 
int main(void) 
{ 
    LARGE_INTEGER freq; 
    LARGE_INTEGER t0, tF, tDiff; 
    double elapsedTime; 
    double resolution; 
    QueryPerformanceFrequency(&freq); 
    QueryPerformanceCounter(&t0); 
    // code to be timed goes HERE 
    { 
     Sleep(10); 
    } 
    QueryPerformanceCounter(&tF); 
    tDiff.QuadPart = tF.QuadPart - t0.QuadPart; 
    elapsedTime = tDiff.QuadPart/(double) freq.QuadPart; 
    resolution = 1.0/(double) freq.QuadPart; 
    printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart); 
    printf("Resolution is %lf nanoseconds\n", resolution*1e9); 
    printf("Code under test took %lf sec\n", elapsedTime); 
    return 0; 
} 

Para algo tan simple como esto, es más rápido para saltar el IDE, simplemente guardarlo en un foo archivo .c y (suponiendo MS VS 2008) utiliza la línea de comandos

cl foo.c 

para construirlo. Aquí está la salida en mi sistema:

Your performance counter ticks 3579545 times per second 
Resolution is 279.365115 nanoseconds 
Code under test took 0.012519 sec 
+0

Gracias. Esto parece un poco demasiado avanzado para mí :). – yCalleecharan

+0

las llamadas son realmente bastante simples, la forma en que las usa es la misma que con clock(), la resolución es mucho mejor que con clock(), y la peor parte es trabajar con enteros de 64 bits. Bueno, también es específico de Windows, pero etiquetaste windows. – JustJeff

+0

Gracias. He agregado el encabezado windows.h pero sigo recibiendo errores. Se produce un error en la línea QueryPerformanceFrequency (&freq); El compilador se queja: E2293) esperado en la línea 12. Otro es: QueryPerformanceCounter (&t0); error es: E2293) esperado en la línea 13. Otro es tDiff = tF - t0; el error es: E2096 Operación ilegal de la estructura en la función main en la línea 57. Último error: elapsedTime = tDiff/(double) freq; El error es: E2110 Conversión de tipo incompatible en la función principal en la línea 58. Lo compilé usando Borland C++ BuilderX. ¿Cualquier sugerencia? – yCalleecharan

6

En los sistemas Unix (creo), el comando time con el nombre de su programa como un argumento de línea de comandos le dirá la hora que tarda el programa en ejecutarse. Tenga en cuenta que esto mide el tiempo de ejecución de todo el programa. Si necesita probar sólo una parte, incluir time.h y utilizar la función de reloj, más o menos así:

#include <time.h> 

int main() { 
    clock_t start; 
    clock_t end; 
    int function_time; 
    start = clock(); 
    function_you_want_to_time(); 
    end = clock(); 
    /* Get time in milliseconds */ 
    function_time = (double)(end - start)/(CLOCKS_PER_SEC/1000.0); 
    return 0; 
} 

que le dará el tiempo en milisegundos (nótese la parte / 1000.0). Si quiere segundos, elimine / 1000.0. Si deseas que el reloj normal garrapatas, que será más preciso, realizar function_time un clock_t y reemplazar la línea function_time = ... con:

function_time = end - start; 

Para tiempo de todo el programa, me sugieren hacer una función llamada _main() o algo así, mover todos su código relacionado con el programa de main() (¡no el código de tiempo!) a esa función, y llamándolo desde main(). De esta forma, queda más claro cuál es el código de tiempo y cuál es el resto del programa.

+0

Una desventaja de esto es que si solo quieres temporizar la porción de cálculo real de algo, por ejemplo, y quieres no incluir los tiempos de carga de recursos/datos o los tiempos de salida o lo que sea, el comando 'time' no puede esto (ya que multiplica toda la ejecución). – Amber

+0

Eso es verdad. Aparentemente, la función 'clock()' es mejor para eso, pero no lo sabía. Agregaré una oración. – Javier

+0

Gracias. Por favor mira mi publicación actualizada. – yCalleecharan

3

Puede usar la función clock() (en <time.h>) si desea probar un bloque de código, o el programa time en * nix, como otro usuario que sugirió. P.ej.

> time ./foo my args 

Para el reloj, debe restar la diferencia entre dos puntos de control. P.ej.

#include <time.h> 

void f() { 
    clock_t start, end; 

    start = clock(); 

    // some long code. 

    end = clock(); 
    printf("Took %ld ticks\n", end-start); 
    // or in (fractional) seconds. 
    printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC); 
} 

actualización

En cuanto a sus nuevos errores, no se pueden mezclar código y declaraciones en VC. No debe llamar a ninguna función y luego continuar declarando variables. Declara todos tus vars en la parte superior o compila con el modo C++.

+0

Recibo muchos errores. ¿Tenemos que definir el tipo de clock_t, start? – yCalleecharan

+0

time.h define clock_t. –

+0

¿Necesitamos tener el vacío f()? O podemos simplemente poner clock_t start, end; start = clock(); ... end = clock(); printf ("Tomó% ld ticks \ n", end-start); dentro principal? – yCalleecharan

1

Probablemente desee time.h, y la función clock().

+0

Gracias. Por favor mira mi publicación actualizada. – yCalleecharan

3

Si necesita un total de su programa a continuación, en la consola de Linux:

$ time myProgram 

También puede utilizar time.h en el código.

#include <time.h> 

int main(){ 
    time_t start, end; 
    start = time(0); 

    /* some working code */ 

    end = time(0); 
    printf("%i seconds", end - start); 
} 
+0

Recibo muchos errores. ¿Tenemos que definir el tipo de time_t, start? – yCalleecharan

+0

Creo que también puede ser 'int'. No tuve que definirlo en ningún lugar de mi Ubuntu. –

0

Puedes probar GetTickCount también. El reloj también funcionará bien. Pero supongo que los valores del reloj cambiarán si algún otro proceso o alguien cambia manualmente la hora del sistema, mientras que los valores de GetTickCount no se verán afectados por eso.

+0

Sí, esta es una alternativa. Voy a investigar esto. – yCalleecharan

Cuestiones relacionadas