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.-
(http://i57.tinypic.com/okrdl4.png)
//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
Mira si te sirve este como punto de inicio:
#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: http://diagramas-de-flujo.blogspot.com.ar/2013/01/medir-tiempo-ejecucion-funcion-en-c.html (http://diagramas-de-flujo.blogspot.com.ar/2013/01/medir-tiempo-ejecucion-funcion-en-c.html)
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
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... :/
Hola fermino.
Que mala onda, ¿debo suponer que nadie de este foro sabe programar en C.?
Saludos.
Daniel
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. ;)
Busqué ahora rápido por Google y vi esto, sufre en Windows, bajo Linux corre perfecto:
Revisa aquí: http://dacap.com.ar/blog/cpp/medir-el-tiempo-de-una-rutina/
#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;
}
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
IRC es un protocolo de chat. Puedes acceder desde aquí: https://kiwiirc.com/client/irc.freenode.net/?nick=UserWeb|?#underc0de (https://kiwiirc.com/client/irc.freenode.net/?nick=UserWeb%7C?#underc0de).
Por lo demás, suerte en eso! Si encuentras algo y funciona bien, puedes postearlo ;)
Esperamos verte seguido por aquí...
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
Usando el ejemplo que brindó fermino hice un ejemplo sencillo y entendible para el problema que planteas Daniel:
#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;
}
(https://dl.dropboxusercontent.com/u/90829106/under.png)
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".
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.-
(http://i57.tinypic.com/1493xg6.jpg)
#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