Medir el tiempo de una rutina en lenguaje C.

Iniciado por NOB2014, Septiembre 03, 2014, 02:23:47 PM

Tema anterior - Siguiente tema

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

Hola a todos.
CitarHago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 62, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar, aprendo todo desde un manual y la generosidad de Uds..-

El enunciado del manual es el siguiente.-



Código: c
//http://dacap.com.ar/blog/cpp/medir-el-tiempo-de-una-rutina/
#include <stdio.h>
#include <windows.h>

/* retorna "a - b" en segundos */
double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
}

int main(int argc, char *argv[]){
int contador=0;
LARGE_INTEGER t_ini, t_fin;
double secs;

QueryPerformanceCounter(&t_ini);
while(contador <= 300000000){
contador++;
if(contador % 100000000 == 0){
QueryPerformanceCounter(&t_fin);
secs = performancecounter_diff(&t_fin, &t_ini);
printf("%.16g milliseconds\n", secs * 1000.0);
QueryPerformanceCounter(&t_ini);
}
}
 
getchar();
return 0;
}



El programa que logré a partir de los ejemplos de la página me funciona correctamente (por lo menos es lo que a mí me parece) lo que pasa es que no entiendo casi ninguna línea (creo que tiene que ver con las API's de windows), la pregunta es ¿alguien me puede decir si se puede lograr lo mismo con con un programa en C puro?, de ser así ¿podrian poner algún ejemplo?.-

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

Mira si te sirve este como punto de inicio:
Código: c
#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[])
{
    clock_t start = clock();
    /* Aquí el Código */
    printf("Tiempo transcurrido: %f", ((double)clock() - start) / CLOCKS_PER_SEC)

    return 0;
}


Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Visita mi blog: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Septiembre 03, 2014, 06:50:49 PM #2 Ultima modificación: Septiembre 03, 2014, 07:18:41 PM por NOB2014
Hola fermino.
En primer lugar un gustazo y espero tener una buena estadía en este foro, lo digo porque soy un "adicto" a preguntar en ellos.-
En cuanto al código lo voy a probar, sólo que leí que clock() tiene muy poca precisión, igual lo voy a correr para ver el resultado.-   

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

La verdad es que no programo en C, así que no sabría decirte. Tampoco se sí clock() devuelve el tiempo en segundos, milisegundos, o que... :/
Visita mi blog: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Hola fermino.
Que mala onda, ¿debo suponer que nadie de este foro sabe programar en C.?


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

No, hay personas que saben, pero en estos últimos días está habiendo poca actividad en el foro. Sino pásate por el chat (IRC), tal vez haya alguien ahi. ;)
Visita mi blog: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Septiembre 03, 2014, 07:41:43 PM #6 Ultima modificación: Septiembre 03, 2014, 07:44:53 PM por Jimeno
Busqué ahora rápido por Google y vi esto, sufre en Windows, bajo Linux corre perfecto:
Revisa aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Código: c
#include <stdio.h>
#include <time.h>
#include <sys/time.h>

/* retorna "a - b" en segundos */
double timeval_diff(struct timeval *a, struct timeval *b)
{
  return
    (double)(a->tv_sec + (double)a->tv_usec/1000000) -
    (double)(b->tv_sec + (double)b->tv_usec/1000000);
}

int main(int argc, char *argv[])
{
  struct timeval t_ini, t_fin;
  double secs;

  gettimeofday(&t_ini, NULL);
  /* ...hacer algo... */
  gettimeofday(&t_fin, NULL);

  secs = timeval_diff(&t_fin, &t_ini);
  printf("%.16g milliseconds\n", secs * 1000.0);
  return 0;
}
Contacto: @migueljimeno96 -

Hola fermino.
CitarSino pásate por el chat (IRC), tal vez haya alguien ahí.
No es mi fuerte, no tengo ni idea que es el IRC.-
Jimeno, es la misma página que yo cité en mi primer código, lo descarté por lo que dice el autor en la misma.-
Muchas gracias a los 2, seguiré investigando.- 

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

IRC es un protocolo de chat. Puedes acceder desde aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Por lo demás, suerte en eso! Si encuentras algo y funciona bien, puedes postearlo ;)
Esperamos verte seguido por aquí...
Visita mi blog: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

CitarEsperamos verte seguido por aquí...
Me encantaría, más que nada porque vos y Jimeno han puesto mucha voluntad para ayudarme y eso se agradece muchísimo, sólo que si no encuentro a alguien que pueda ayudarme en C, dudo mucho que nos sirva
(a mí y al foro), de cualquier manera la próxima duda que tenga me tendrán por aquí.-
   
Saludos y un gran abrazo para todos.
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.-

Septiembre 03, 2014, 11:38:23 PM #10 Ultima modificación: Septiembre 03, 2014, 11:43:58 PM por S t Ø r M d ∆ r k
Usando el ejemplo que brindó fermino hice un ejemplo sencillo y entendible para el problema que planteas Daniel:

Código: c

#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[])
{
clock_t start = clock(); //Inicia la cuenta del reloj
long long int i=1;
while(i<=300000000) //el ciclo va a parar hasta que el contador sea igual a 300000000
{
i++;
if(i%100000000==0)//si el residio de i / 100000000 es cero entonces es multiplo
{
printf("Numero: %i \n", i);//imprime i
printf("Tiempo transcurrido: %f", ((double)clock() - start) / CLOCKS_PER_SEC);//imprime el tiempo
printf("\n");//salto de linea
}
}
    return 0;
}


Saludos, espero que te haya servido.

Nota para los usuarios de este foro:
Si no saben del tema que se esta tratando, entonces no le proporcionen links a la persona que está preguntando sin saber si tan siquiera funciona, es como si yo fuera al doctor y el me dijera lo mismo que ustedes: "no se que tienes, pero toma estas medicinas a ver si te funcionan".
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
In my mind where before there was order, today there is only chaØs!

Hola S t Ø r M d ∆ r k
Gracias por el código, gracias por tu tiempo.-
Ahora me surge la duda de la gran imprecisión que tiene la función clock() y que todo el mundo menciona, el código que dejo a continuación demuestra que no hay ninguna diferencia utilizando time.h y windows.h, tienen alguna experiencia al respecto, o algo que me clarifique el panorama ?.-
Me puse un poco celoso cuando comprobé la velocidad de tu maquina.-   



Código: c
#include <stdio.h>
#include <time.h>
#include <windows.h>

double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b);

int main(int argc, char *argv[]){
LARGE_INTEGER t_ini, t_fin;
double secs;
int i=0;
QueryPerformanceCounter(&t_ini);
clock_t start = clock();
printf("\n Para contar de 0 a 300.000.000 esta maquina tarda...");
while(i < 300000000){
i++;
}
printf("\n\n Utilizando time.h......: %f segundos",
  ((double)clock() - start) / CLOCKS_PER_SEC);

QueryPerformanceCounter(&t_fin);
secs = performancecounter_diff(&t_fin, &t_ini);
printf("\n\n Utilizando windows.h...: %.16g milisegundos\n", secs * 1000.0);

  return 0;
}

double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
}

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