Medir velocidad de ejecución de un programa en lenguaje C.-

Iniciado por NOB2014, 3 Abril 2016, 21:49 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola, gente.
Esta vez los molesto por poco, me podrían decir que tengo que agregar a mi código para medir el tiempo que tarda en ejecutarse, busqué en foros y lo que intené no funcionó. -
Es probable que me quieran dar un tirón de orejas por tratar de reinventar la rueda, pero créanme que es tan solo para practicar con punteros y de paso cotejarlo con el método de la burbuja y saber que es más rápido si un doble for o un bucle while. -

#include <stdio.h>

void ordenar(size_t *ptrV, size_t elementos);
void mostrar(size_t *ptrV, size_t elementos);

int main( void ){
size_t vector[] = {99, 8, 13, 6, 104, 40, 7, 2, 1}, *ptrV = vector;
static size_t elementos = sizeof (vector) / sizeof (size_t);

ordenar(ptrV, elementos);
mostrar(ptrV, elementos);

return 0;
}

void ordenar(size_t *ptrV, size_t elementos){
size_t i, tmp = 0;

while(1){
if( *(ptrV+i) >  *(ptrV+(i+1)) ){
tmp = *(ptrV+i);
*(ptrV+i) = *(ptrV+(i+1));
*(ptrV+(i+1)) = tmp;
}
if( i+1 == elementos ){
if( tmp == 0) break;
else{tmp = 0; i = -1;}
}
i++;
}
}

void mostrar(size_t *ptrV, size_t elementos){
size_t i;

for( i = 0; i < elementos; i++ )
printf( " %u", *(ptrV+i) );
}


Desde ya muchas gracias. -

Saludo.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS

Si usas Unix o derivado usa el comando time. Suponiendo que tu programa se llame 'mi_programa'
escribe en el shell
Código (Bash) [Seleccionar]
time ./mi_programa

ivancea96

Código (cpp) [Seleccionar]
#include <time.h>
#include <stdio.h>

int main(){
    clock_t cl = clock();
    // Programa
    cl = clock()-cl;
    printf("%i", (cl*1000)/CLOCKS_PER_SEC);
}

NOB2014

#3
Ivancea96, cuando corro lo que me sugeriste agregar me pasa esto:



compila a la perfección solo que cambie el %i por %li (me daba error).-

Daniel.




MAFUS.
Lo tuyo funciona solo que no se cierra el programa hasta apretar Enter por lo tanto en segundos el tiempo tomado no es tan preciso. -
En cuanto a Windows el que dejo a continuación, funciona (no lo verifique, pero debe ser muy parecido al de ivancea96 ) como lo posteo, pero si lo aplico al programa me hace exactamente lo mismo que al principio. -
desconozco que efecto extraño produce el programa que ordena que si le agrego esas pocas líneas revienta, seguiremos investigando, igual espero que alguien se ilumine y pueda hallar la solución. -

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

int main( void )
{
long int i=0;
clock_t comienzo;

comienzo=clock();
for( i=0; i<10000; i++ ){
printf("*");
}

printf( "\n Sgundos transcurridos.....: %f s\n", (clock()-comienzo)/(double)CLOCKS_PER_SEC );

return 0;
}


Daniel.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

Me funciona correctamente. ¿Cuál es el código que te falla, y qué código de error lanza?

NOB2014

Hola.
Citar¿Cuál es el código que te falla?
Cuando le agrego las líneas que me sugeriste.
Citar¿qué código de error lanza?
Al compilar ninguno, al ejecutar no muestra nada y aparece el mensaje que postee anteriormente. -
Cuando decís que te funciona correctamente, te referís a que ¿lo estás corriendo dentro del programa mío o con algún código diferente?. -

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

class_OpenGL

El problema está en la función "ordenar". No has inicializado la variable "i", por lo que al principio del while esta variable tiene un valor basura, que por casualidad, no te da error cuando pones solo tu código pero si que da error cuando fusionamos tu código con el de contar el tiempo. Repito, es casualidad que al principio no diera error

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

NOB2014

Hola,  class_OpenGL.
Efectivamente, esa variable era la causante del error, cuando cambie el bucle for por el while no lo tube en cuenta. -
En la función printf efectué 2 cambios y quedo así (de lo contrario me daba errores):

printf("\n\n Milesegundos transcurridos.....:%f", (cl*1000)/(double)CLOCKS_PER_SEC);

%f y (double)

Por último ¿es coherente que me de el resultado con el signo menos?
-98.000000
-95.000000

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

No, no lo es. Si vas a trabajar con milisegundos, te recomiendo tratarlo como entero. En Windows, no tendrás microsegundos.

Luego, asegúrate de haber hecho clock()-cl y no al revés.

class_OpenGL

He probado el programa y me salen 0 milisegundos (recuerda que solo mides milisegundos, y estos se truncan), ninguna cifra negativa.

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL