JJ / implementacion-eas

Repo para la asignatura del máster de arquitectura de computadores y redes.
GNU General Public License v3.0
2 stars 6 forks source link

¿Cómo temporizas los algoritmos? #13

Closed JJ closed 10 years ago

JJ commented 10 years ago

¿Qué herramientas del sistema/de la librería/de la caja de herramientas usas para temporizar los algoritmos?

seiya64 commented 10 years ago

Siempre suelo usar la que venga por defecto. Justo después de definir las variables y antes de empezar el algoritmo, y al final; antes de hacer los print.

Suelo hacerlo en webs cuando los tiempos de respuesta me parecen excesivos. Pero no es una práctica que siga habitualmente.

JJ commented 10 years ago

¿Por ejemplo?

seiya64 commented 10 years ago

En php uso time() y lo guardo antes de empezar, time() al final, lo resto y ahí tengo mi tiempo.

JJ commented 10 years ago

Y ese, ¿qué tiempo es? Eso admitiendo, claro, PHP como lenguaje de programación :-)

seiya64 commented 10 years ago

La hora actual del sistema. http://www.w3schools.com/php/func_date_time.asp

JJ commented 10 years ago

Y eso no es totalmente bueno porque...

JJ commented 10 years ago

En todo caso, ya lo verás cuando empieces a hacer mediciones. O lo habrás visto.

seiya64 commented 10 years ago

Entiendo que sea por la precisión. Pero a mí me preocupa a partir de varios segundos... No creo que no sea totalmente bueno :S

JJ commented 10 years ago

No, no es la precisión.

Ejecuta un comando con time delante y verás cosas interesantes.

pablopaolus commented 10 years ago

Yo, por ejemplo, la última vez que usé funciones para medición de tiempo fue en C y utilicé la librería time.h, en concreto la función clock(). Después de declarar e inicializar las variables del programa, hacía: inicio=clock() Y, antes de los print: stop=clock() Para calcular y mostrar el tiempo transcurrido en el trozo de código deseado hacía: printf("El tiempo es de %f \n\n",difftime(stop,inicio)/CLOCKS_PER_SEC);

seiya64 commented 10 years ago

Después de ver el time del sistema. Creo que en lenguajes como php por ejemplo no se puede llegar a eso. En C++ y tal, supongo que sí. Pero en php como mucho puedes llegar a microtime() que te da el tiempo en microsegundos.

JJ commented 10 years ago

@pablopaolus es también wallclock. Para medir el tiempo de un algoritmo secuencial tienes que usar el tiempo de usuario, no el del sistema. @seiya64 es que para llamarse lenguaje hay que tener estudios...

seiya64 commented 10 years ago

xDDD

rotty11 commented 10 years ago

Hasta ahora donde he necesitado hacer mediciones ha sido en C, C++ y Java. Para los dos primeros, al igual que Pablo, he tenido que usar clock() o bien el struct timeval de time.h que proporciona precisión de microsegundos dado que el reloj en el kernel de Linux lo soporta. Windows NO!! jajajajaja. Para java, System.currentTimeMillis() justo antes y después del tiempo que quiero medir, aunque sólo proporciona el tiempo con precisión de milisegundos. Por otro lado, comentais el usar time delante de un comando no? Tengo entendido que propociona el tiempo que tarda en ejecutar el comando incluyendo el tiempo de espera, bloqueo... hasta que pasa al estado de ejecución. Eso sería el último recurso que usaría para medir tiempos si no tuviera otra opción

JJ commented 10 years ago

@rotty11 pruébalo.

unintendedbear commented 10 years ago

A mí me pasa como a Pablo, he usado la librería time.h. En Perl estoy buscando información y he encontrado el módulo Time::HiRes. Con este módulo y haciendo:

($s, $usec) = gettimeofday();

Se obtienen en $s los segundos y en $usec los microsegundos. Entonces, para intervalos de tiempo:

$t0 = [gettimeofday]; $t1 = [gettimeofday]; $t0_t1 = tv_interval $t0, $t1;

JJ commented 10 years ago

Mirad esto, por ejemplo http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1

JJ commented 10 years ago

Una de las formas de hacerlo desde Perl es usar esto http://search.cpan.org/~taffy/Unix-Getrusage-0.03/lib/Unix/Getrusage.pm o bien usar time desde la línea de órdenes. http://search.cpan.org/~jhi/BSD-Resource-1.2907/Resource.pm Desde C, sys/times.h

deantares commented 10 years ago

Participo para que no me regañe JJ :8ball:

Cómo suelo programar bastante en JAVA, normalmente uso alguna herramienta avanzada de profiler, cómo por ejemplo la que proporciona NETBEANS [1].

Depende también del tipo de medida que me interese. Por ejemplo, para temas web o cloud, realmente interesa más el tiempo real que el tiempo de procesador (pe. para saber si una petición no se ha procesado o para tareas de sincronización). En esos casos, gracias a trabajar en sistemas LINUX, suelo usar las peticiones nativas del sistema para la gestión del tiempo.

[1] https://profiler.netbeans.org/

JJ commented 10 years ago

@deantares Pero ¿tienes acceso a esa herramienta desde el progrma? ¿O te puede generar informes que luego puedas usar en el análisis del algoritmo?

Investigador commented 10 years ago

Algo tarde, pero el trabajo no me ha dejado conectarme antes, perdonad. El caso es que yo solo he necesitado temporizar partes de un programa, de higos a brevas, y claro cuando he necesitado algo así, he usado la clase de java: javax.swing.Timer Con esta clase sólo con instanciarla, y pasarle el tiempo en milisegundos en el que queremos que nos avise, o haga lo que sea, un Actionlistener, usando el método actionPerformed() ya tenemos la ejecución periódica. Para empezar a contar usamos el método start() cuando queremos que el temporizador empiece, o stop() para detenerlo, y si deseamos que sea cíclico setRepeats(boolean), en el boolean especificamos si queremos que sea repetitivo o no. He leído que también se puede usar la clase general java.util.Timer , pero no la he usado y me parece más compleja de usar, así que no puedo hablar mucho de ella.

JJ commented 10 years ago

Como le he indicado a tus compañeros, eso sólo mide el "wallclock time", no el tiempo que realmente el programa ha empleado en la CPU.

JJ

Investigador commented 10 years ago

Estimado JJ;

Estoy liado con el trabajo final de la asignatura y quería preguntarte si lo que he hecho vale, porque tras leer el enunciado de nuevo me entró la duda (y ya lo tengo codificado, sólo me quedan las mediciones y la documentación).

He realizado un algoritmo genético que mediante la minimización de una función, en un intervalo dado (usando una función bidimensional), mediante una selección de torneos de 2, cruce en un punto, mutación en un punto, definiendo el valor para el que función parará el algoritmo. Usando elitismos de un individuo y para facilitar la operatoria un número impar de individuos (por ejemplo 11, de los cuales tomamos 10 para cruzarlos, que generan 10 hijos, que a su vez son mutados generando una población de 10 individuos a los que se añade el mejor individuo de la generación anterior). El número de individuos, probabilidad de cruce, mutación, etc... los defino como constantes en el propio programa.

¿Esto vale?, es que anoche me entró la duda y ya no sé que hago.

un saludo y gracias Alfonso Soto

JJ commented 10 years ago

Alfonso, la única forma que tengo de ver si vale o no es evaluarlo; con lo que me cuentas puede valer o todo lo contrario.

El 4 de junio de 2014, 15:54, Alfonso notifications@github.com escribió:

Estimado JJ;

Estoy liado con el trabajo final de la asignatura y quería preguntarte si lo que he hecho vale, porque tras leer el enunciado de nuevo me entró la duda (y ya lo tengo codificado, sólo me quedan las mediciones y la documentación).

He realizado un algoritmo genético que mediante la minimización de una función, en un intervalo dado (usando una función bidimensional), mediante una selección de torneos de 2, cruce en un punto, mutación en un punto, definiendo el valor para el que función parará el algoritmo. Usando elitismos de un individuo y para facilitar la operatoria un número impar de individuos (por ejemplo 11, de los cuales tomamos 10 para cruzarlos, que generan 10 hijos, que a su vez son mutados generando una población de 10 individuos a los que se añade el mejor individuo de la generación anterior). El número de individuos, probabilidad de cruce, mutación, etc... los defino como constantes en el propio programa.

¿Esto vale?, es que anoche me entró la duda y ya no sé que hago.

un saludo y gracias Alfonso Soto

— Reply to this email directly or view it on GitHub https://github.com/JJ/implementacion-eas/issues/13#issuecomment-45092912 .

JJ

Investigador commented 10 years ago

Hola de nuevo;

Bueno pues acabo la documentación y los tiempos de medida y lo subo, es el primer algoritmo genético que hago, en mi vida había hecho nada de esto y sé que es una chorrrada, y que es muy simple, pero que a gusto me quedé cuando pude ejecutarlo.

un saludo y gracias Alfonso Soto

From: Juan Julián Merelo Guervós Sent: Wednesday, June 4, 2014 5:49 PM To: JJ/implementacion-eas Cc: Alfonso Subject: Re: [implementacion-eas] ¿Cómo temporizas los algoritmos? (#13)

Alfonso, la única forma que tengo de ver si vale o no es evaluarlo; con lo que me cuentas puede valer o todo lo contrario.

El 4 de junio de 2014, 15:54, Alfonso notifications@github.com escribió:

Estimado JJ;

Estoy liado con el trabajo final de la asignatura y quería preguntarte si lo que he hecho vale, porque tras leer el enunciado de nuevo me entró la duda (y ya lo tengo codificado, sólo me quedan las mediciones y la documentación).

He realizado un algoritmo genético que mediante la minimización de una función, en un intervalo dado (usando una función bidimensional), mediante una selección de torneos de 2, cruce en un punto, mutación en un punto, definiendo el valor para el que función parará el algoritmo. Usando elitismos de un individuo y para facilitar la operatoria un número impar de individuos (por ejemplo 11, de los cuales tomamos 10 para cruzarlos, que generan 10 hijos, que a su vez son mutados generando una población de 10 individuos a los que se añade el mejor individuo de la generación anterior). El número de individuos, probabilidad de cruce, mutación, etc... los defino como constantes en el propio programa.

¿Esto vale?, es que anoche me entró la duda y ya no sé que hago.

un saludo y gracias Alfonso Soto

— Reply to this email directly or view it on GitHub https://github.com/JJ/implementacion-eas/issues/13#issuecomment-45092912 .

JJ — Reply to this email directly or view it on GitHub.

JJ commented 10 years ago

:-)

Me alegro.