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.

HardForo

#20
No puedo decir que este "bien" ahora pero parece ser que al menos por un factor de 100 estaba errado antes.


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

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

comienzo=clock();

// programa
for( i=0; i<5000000; i++ ){
printf("*");
}

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

return 0;
}



Segun leo en StackOverflow: "CLOCKS_PER_SEC might be defined as 1000000, depending on what options you use to compile, and thus it does not seem like a good solution."

http://stackoverflow.com/questions/5248915/execution-time-of-c-program

---
PD: realmente veo que ni siquiera es un factor multiplo de 10
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

ivancea96


HardForo

#22
Me tomé el trabajo de medir el tiempo de ejecucion del programa que posteé (o sea le subi el tiempo hasta que sea posible medirlo facilmente) y como digo...... el valor esta "en el orden" de los SEGUNDOS (correcto ahora para mi SO) pero tampoco es creo exacto (me difiere en algunos segundos)

Veo el problema como algo "grave" ya que nadie parece tener la seguridad de como es y menos cross-plataform o cross-compiler
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

ivancea96

En Windows, suele ser CLOCKS_PER_SEC = 1000, y en Unix = 1000000. clock también retorna un valor acorde a estas cantidades y correcto.

1. ¿Qué valor tiene CLOCKS_PER_SEC en tu SO?
2. ¿Qué SO es?
3. ¿El valor retornado por tu clock() va en el rango de los milisegundos o de los microsegundos? ¿Otro quizás?

HardForo

Uso Windows 6.3 y si vale 1000 como dices

En fin.... me toco multiplicar por 100 como decia respecto del programa aportado aqui para que tenga algun sentido....
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

ivancea96

¿Qué valor da clock()-comienzo en una diferencia aproximada de 1 segundo? En entero, sin coma flotante.

NOB2014

Hola.
Perdón por interponerme pero el código de boctulus me da resultados correctisimos, medido con un reloj de una página de internet, correctisimos. -

Solo que lo hago como dijo MAFUS, en segundos. -

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

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.-

HardForo

#27
El codigo no es mio, es la forma estandar de usar la libreria

Pero como digo en Windows el factor es de 100 (aprox) asi que creo este tipo de calculos deberian hacerse con ayuda del precompilador (#ifndef _Windows ...) al menos que se quiera solo valores relativos (mismo computador, mismo SO)


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

#ifdef __linux__
    #define TIMEFACTOR   1
#elif _WIN32
    #define TIMEFACTOR   100
#else
// definir
#endif

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

comienzo=clock();

// programa
for( i=0; i<1000000; i++ ){
printf("*");
}

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

return 0;
}
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

ivancea96

Insisto, el único "factor" es CLOCKS_PER_SEC, que para eso existe.
Multiplicar por 1000, da milisegundos. multiplicar por 100, centisegundos.

Si en tu compilador o sistema no funciona así, habrá que analizar por qué. Poner un coeficientes que cuadre no es una opción lógica.

Prueba si quieres en otro PC, en otro SO o en una máquina virtual para ver el resultado que debiera dar.

HardForo

Ivan: me parece perfecto que insistas, estoy tratando de ver porque no me concuerdan los resultados.

Siguiendo con la liberia time.h, te pido mires este codigo....... no le encuentro el fallo:


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

int main( void )
{

// solo como control adicional
  time_t tiempo1 = time(0);
  time_t tiempo2 = time(0);
  struct tm *tini = localtime(&tiempo1);
  struct tm *tfin = localtime(&tiempo2);
  char output[128];


  strftime(output,128,"%d/%m/%y %H:%M:%S",tini);
  printf("%s\n",output);

// programa
for(int i=0; i<40000000; i++ ){
}

  strftime(output,128,"%d/%m/%y %H:%M:%S",tfin);
  printf("%s\n",output);

return 0;
}


No logro muestre dos fechas-horas distintas! 

PD: quiero utilizar esto para rematar con el tema..... probando si es necesario o no un TIMEFACTOR adicional (pues en realidad quiero estar de acuerdo contigo)
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *