Discussion:
Medir el tiempo
(demasiado antiguo para responder)
Daniel Hernandez
2004-07-10 23:54:10 UTC
Permalink
Hola, he intentado de medir el tiempo de un algoritmo
que estoy escribiendo, pero es demasiado rápido.

Primero intenté con:

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

int *
main ()
{
clock_t s, e;
double time;

s = clock ();
for (j = 0; j < 10000; ++j);
e = clock ();

time = ((double)(e - s)) / CLOCKS_PER_SEC;
printf ("%f\n", time);
}

Luego probe hacer lo mismo com times() en vez de
clock(), pero en ambos casos la resolución del
tiempo es muy baja, sólo de milisegundos. Me gustaría
poder medir en microsegundos o en nanosegundos.
He buscado ejemplos en la web pero todos ellos me
funcionan en milisegundos.

Actualmente estoy usando gcc 2.95.4 en linux.

Saludos y de antemano gracias.

Daniel Hernández
Santiago, Chile.
Daniel Hernandez
2004-07-11 01:55:07 UTC
Permalink
Hola,
Al final he dado con la siguiente solucion: usar la
función gettimeofday como en el siguiente código.

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

int
main ()
{
int i;
struct timeval s, e;
long int time;

gettimeofday (&s, NULL);
for (i = 0; i < 10000000; ++i);
gettimeofday (&e, NULL);

time = e.tv_usec - s.tv_usec;
printf ("%i\n", time);

return 0;
}

De este modo el tiempo que obtengo viene en
nanosegundos.

Saludos.
RETECAL nos tima - MechaKaiser
2004-07-13 16:12:11 UTC
Permalink
¿Y si ejecutas el algoritmo 1000 veces contando el tiempo total y luego lo
divides?
Daniel Hernandez
2004-07-13 20:02:36 UTC
Permalink
Post by RETECAL nos tima - MechaKaiser
¿Y si ejecutas el algoritmo 1000 veces contando el tiempo total y luego lo
divides?
Entonces, la ejecucion del experimento tardaria 1000
veces mas.

Esto no es problema con algoritmos a los cuales le
metes una unica entrada, pero si estas probando
con un rango amplio de valores, supongamos, para
x e y tales que 0 < x < 10^3, 1 < y < 10^3,
habria que hacer que hacer 10^6 de estos
experimentos pequenos. Si cada uno de ellos se
demora del orden de los 100 microsegundos, estamos
frente a que la simulacion total se demoraria 10^3
seg. Si la ejecuto 1000 veces se demoraria
10^6 seg = 277 hrs. Entonces tendria que ralear
el conjunto de entrada para no aburrirme en la
espera, sobretodo, si necesito hacer varios
exprimentos sucesivos para ajustar algun parametro
del algoritmo.

Otro problema es si la generacion de la entrada
es seudoaleatoria y costosa, y que luego de
aplicarle el algoritmo esta ya no sirva pues
es modificado dentro de el. Habria que sacarle
1000 copias a cada entrada generada con ese
algoritmo costoso y luego ocupar cada una de
ellas en las 1000 ejecusiones del experimento.
Pero esto consumiria mas memoria y es mas
engorroso de programar.

La ventaja eso si de hacer una cosa varias veces
y despues dividir es que se elimina el ruido.

De todas formas, gracias y no os preocupeis, no
era gran cosa lo que estaba haciendo y ya esta
solucionado.

Saludos
Daniel Hernandez
2004-07-13 19:10:57 UTC
Permalink
Post by Daniel Hernandez
De este modo el tiempo que obtengo viene en
nanosegundos.
Me equivoque, era en microsegundos.
Daniel Hernandez
2004-07-13 19:21:03 UTC
Permalink
Me dijeron que una solucion mejor era usar un programa
especifico para estudiar el rendimiento de los
programas, como gprof. Les cuento esto por si a alguien
le interesa. Yo aun no lo he probado.
J.A. Gutierrez
2004-07-15 06:33:20 UTC
Permalink
Daniel Hernandez <***@ing.uchile.cl> wrote:

: gettimeofday (&s, NULL);

esa llamada es no portable.
Como minimo deberias usar algo tipo:

#if defined __SVR4 || defined _HPUX_SOURCE || defined __linux__ || defined __osf__ || defined __APPLE__
gettimeofday(&tp, NULL);
#else
gettimeofday(&tp);
#endif

Ademas, eso te da le tiempo de "reloj de la pared"; no el tiempo
real de CPU usado por tu codigo.
--
finger ***@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
Antoine Leca
2004-07-15 09:13:04 UTC
Permalink
Post by J.A. Gutierrez
Post by Daniel Hernandez
gettimeofday (&s, NULL);
esa llamada es no portable.
Es provocación, no?
Post by J.A. Gutierrez
#if defined __SVR4 || defined _HPUX_SOURCE || defined __linux__ \
|| defined __osf__ || defined __APPLE__
gettimeofday(&tp, NULL);
#else
gettimeofday(&tp);
#endif
gettimeofday() ha nacido en 4.xBSD, y con la formulación de arriba.
Entonces, la versión per defecte debería estar la primera.

No olvides que en C, muchas veces es posible pasar un argumento de sobra,
sin problema (él que llama es él que limpia); pero si olvides pasar un
argumento requirido, le normal es que ocurira SIGSEGV.

Por fin, esta formulación está normalizada en XPG4.2, por lo cual la manera
correcta de probar es de comparar _XOPEN_SOURCE con 420.


Una pregunta: que sistema has encontrado que necesita un solo argumento para
gettimeofday() ?


Antoine
J.A. Gutierrez
2004-07-15 16:26:46 UTC
Permalink
Antoine Leca <***@localhost.gov> wrote:
: En cd58ff$5t7$***@news-4.escomposlinux.org, J.A. Gutierrez va escriure:
:> Daniel Hernandez <***@ing.uchile.cl> wrote:
:>
:>> gettimeofday (&s, NULL);
:>
:> esa llamada es no portable.

: Es provocación, no?

?
no, simplemente resultado de experiencia propia y de que
se me quejen compiladores variados...

:> Como minimo deberias usar algo tipo:
:>
:> #if defined __SVR4 || defined _HPUX_SOURCE || defined __linux__ \
:> || defined __osf__ || defined __APPLE__
:> gettimeofday(&tp, NULL);
:> #else
:> gettimeofday(&tp);
:> #endif

: gettimeofday() ha nacido en 4.xBSD, y con la formulación de arriba.
: Entonces, la versión per defecte debería estar la primera.


Bueno ya puestos a incordiar, te puedes encontrar por ahi
multiples prototipos diferentes para esa llamada:

XPG4:
int gettimeofday(struct timeval *tp, void *tzp);

System V:
int gettimeofday(struct timeval *tp, ...);

BSD:
int gettimeofday(struct timeval *tp, struct timezone *tzp);


De todas formas si que es cierto que hoy en dia, lo mas
comun es encontrartelo den la forma de dos argumentos, por lo
que ciertamente, seria mejor dejar por defecto esa forma
y poner explicitamente los casos en los que es necesario la
otra.

: No olvides que en C, muchas veces es posible pasar un argumento de sobra,
: sin problema (él que llama es él que limpia); pero si olvides pasar un
: argumento requirido, le normal es que ocurira SIGSEGV.

puede que sea posible, pero depende del prototipo, no es correcto,
y lo normal es que el compilador te avise al respecto...


: Por fin, esta formulación está normalizada en XPG4.2, por lo cual la manera
: correcta de probar es de comparar _XOPEN_SOURCE con 420.

...si confias en que se hayan molestado en definirlo, lo que
no se si suele ser el caso.

: Una pregunta: que sistema has encontrado que necesita un solo argumento para
: gettimeofday() ?

Pues ahora mismo no estoy seguro, creo recordar que en SunOS 4.x

Como ejemplo de como tratar con esta cuestion, segun tengo
entendido, se puede buscar en el codigo fuente de Emacs.
--
finger ***@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
Antoine Leca
2004-07-19 08:33:33 UTC
Permalink
Post by J.A. Gutierrez
Post by Antoine Leca
Una pregunta: que sistema has encontrado que necesita un solo
argumento para gettimeofday() ?
Pues ahora mismo no estoy seguro, creo recordar que en SunOS 4.x
http://www.freebsd.org/cgi/man.cgi?query=gettimeofday&apropos=0&sektion=0&ma
npath=SunOS+4.1.3&format=html

(Y tengo entendido que SunOS es muy proximo a 4.xBSD, por lo cual sería muy
sorprenente.)

Pero he encontrado lo que tu dices: parece ser Solaris 2.4
http://www.cygwin.com/ml/cygwin/1997-05/msg00695.html



Antoine

DJ
2004-07-15 13:23:14 UTC
Permalink
Leete esto http://atc.ugr.es/docencia/udigital/1203.html#03
trae como programar el temporizador del sistema y algunas cosas interesantes
mas. Quizas te sirva.

Dj.
Loading...