usar tiempo programa por poner parametros nanosegundos medir medidor linea ejemplos ejecucion como comandos calcular c windows time elapsed

por - Tiempo transcurrido de ejecución de un programa C



tiempo de ejecucion en nanosegundos c++ (6)

Me gustaría saber qué líneas de código C agregar a un programa para que me diga el tiempo total que el programa tarda 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 ?

Muchas gracias...

Actualización Tengo una máquina Win Xp. ¿Está simplemente agregando el clock() al comienzo 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 va 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; }

Aclamaciones

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 como con Borland C ++ builderX desde 2003.


En sistemas Unix (creo), el comando de time con el nombre de su programa como un argumento de línea de comandos le dirá la hora que el programa tarda en ejecutarse. Tenga en cuenta que esto mide el tiempo de ejecución de todo el programa. Si necesita probar solo una parte, incluya time.h y use 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; }

Eso le dará el tiempo en milisegundos (observe la parte / 1000.0 ). Si quieres segundos, elimina / 1000.0 . Si quiere un clock_t - clock_t sencillo, que será más preciso, establezca function_time a clock_t y reemplace la línea function_time = ... por:

function_time = end - start;

Para _main() todo el programa, sugiero hacer una función llamada _main() o algo así, mover todo el código relacionado con el programa de main() (¡no el código de tiempo!) A esa función, y llamarlo 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.


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


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

> time ./foo my args

Para el reloj, necesita 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); }

Actualizar

En cuanto a sus nuevos errores, no puede 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 ++.


Si necesita un total para su programa, entonces en la consola Linux:

$ time myProgram

También puedes usar time.h en tu 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 ); }


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.


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, un tercio de un nano segundo, y no creo haberlo 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, estos acceden a un dispositivo de conteo de hardware que está vinculado a algún oscilador del sistema en la placa principal, en cuyo caso no deberían sufrir fluctuaciones debido a la carga del software. La resolución que obtienes depende de tu sistema.

SEGUIR

Aquí hay un programa completo muy simple 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 omitir el IDE, solo guárdelo en un archivo foo.c y (suponiendo MS VS 2008) use la línea de comando.

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