Fecha y hora actual: Lunes 17 Feb 2020 08:08
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Medir el tiempo de una rutina en lenguaje C.

Responder al Tema

Índice del Foro > C, C#, Visual C++ > Medir el tiempo de una rutina en lenguaje C.

Autor Mensaje
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Miércoles 03 Sep 2014 16:20

Título del mensaje: Medir el tiempo de una rutina en lenguaje C.

Responder citando

Hola Amigos.
El enunciado del manual es el siguiente.-



Código:
  1. //http://dacap.com.ar/blog/cpp/medir-el-tiempo-de-una-rutina/
  2. #include <stdio.h>
  3. #include <windows.h>
  4.  
  5. /* retorna "a - b" en segundos */
  6. double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
  7. LARGE_INTEGER freq;
  8. QueryPerformanceFrequency(&freq);
  9. return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
  10. }
  11.  
  12. int main(int argc, char *argv[]){
  13. int contador=0;
  14. LARGE_INTEGER t_ini, t_fin;
  15. double secs;
  16.  
  17. QueryPerformanceCounter(&t_ini);
  18. while(contador <= 300000000){
  19. contador++;
  20. if(contador % 100000000 == 0){
  21. QueryPerformanceCounter(&t_fin);
  22. secs = performancecounter_diff(&t_fin, &t_ini);
  23. printf("%.16g milliseconds\n", secs * 1000.0);
  24. QueryPerformanceCounter(&t_ini);
  25. }
  26. }
  27.  
  28. return 0;
  29. }



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 dar alguna pista?.-

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.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Miércoles 03 Sep 2014 18:22

Título del mensaje: Medir el tiempo de una rutina en lenguaje C.

Responder citando

El funcionamiento del programa es muy sencillo.

QueryPerformanceFrequency devuelve la frecuencia de reloj del procesador. Y no como la da el panel de control, que redondea, sino como número entero largo con 10 cifras.

QueryPerformanceCounter da el valor del contador del procesador. En cada ciclo de reloj se incrementa ese contador en uno, de manera que en un segundo se incrementa en lo que devuelve QueryPerformanceFrequency.

Si llamas a QueryPerformanceCounter dos veces en un intervalo de tiempo y la resta de ambos valores la divides entre lo que devuelve QueryPerformanceFrecuency, tienes el tiempo en segundos que ha pasado en el intervalo de tiempo ese con una precisión muy, pero que muy, grande.

Eso hace la función performancecounter_diff. Le pasas los dos valores del contador, le resta uno de otro y lo divide entre la frecuencia del procesador.

Un ordenador de ahora tiene 3 relojes. Está el generador de frecuencia para la placa base que puso ibm en el xt, el reloj completo que se añadió después, y el reloj consultable que lleva la cpu. La cpu siempre ha llevado un reloj pero no siempre ha sido consultable por programa.

Eso que llamas c puro (o c++ más bien) usa como mucho el segundo reloj que se añadió después, con la estructura time_t, y con mucha menor precisión.

El c puro tampoco da para mucho. En cuanto te metes en programas complejos (cualquiera de esos pro que valen una pasta) tienes que echar mano de funciones del sistema operativo. O eso o ensamblador. QueryPerformanceFrequency y QueryPerformanceCounter pueden sustituirse por instrucciones en ensamblador.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Miércoles 03 Sep 2014 19:49

Título del mensaje: Medir el tiempo de una rutina en lenguaje C.

Responder citando

Hola Pico.
Muy interesante tu aclaración, cuando sepa construir librerías programaré una para este caso y quedará como una instrucción más.-
Debo suponer que esto no es nada portable entre sistemas operativos, si lo tendría que instalar en una maquina con Linux, el programa no funcionaria.-
Bueno Dios dirá o Pico o unsigned.- Ok

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.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Miércoles 03 Sep 2014 20:41

Título del mensaje: Medir el tiempo de una rutina en lenguaje C.

Responder citando

Nada portable. Prodría serlo una librería que te hicieras.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Viernes 05 Sep 2014 01:08

Título del mensaje: Medir el tiempo de una rutina en lenguaje C.

Responder citando

Hola Pico.
Te consulto nuevamente porque hice un mix con las 2 bibliotecas y no le encuentro diferencias a ambas mediciones, lo que me intriga es que todo lo que llevo leído hablan de gran imprecisión utilizando la función clock() y en este caso no lo parece.-
Bueno es todo, espero me puedan aclarar el panorama.-

Código:
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <windows.h>
  4.  
  5. double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b);
  6.  
  7. int main(int argc, char *argv[]){
  8. LARGE_INTEGER t_ini, t_fin;
  9. double secs;
  10. int i=0;
  11. QueryPerformanceCounter(&t_ini);
  12. clock_t start = clock();
  13. printf("\n Para contar de 0 a 300.000.000 esta maquina tarda...");
  14. while(i < 300000000){
  15. i++;
  16. }
  17. printf("\n\n Utilizando time.h......: %f segundos",
  18. ((double)clock() - start) / CLOCKS_PER_SEC);
  19.  
  20. QueryPerformanceCounter(&t_fin);
  21. secs = performancecounter_diff(&t_fin, &t_ini);
  22. printf("\n\n Utilizando windows.h...: %.16g milisegundos\n", secs * 1000.0);
  23.  
  24. return 0;
  25. }
  26.  
  27. double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
  28. LARGE_INTEGER freq;
  29. QueryPerformanceFrequency(&freq);
  30. return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
  31. }


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.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Viernes 05 Sep 2014 18:22

Título del mensaje: Medir el tiempo de una rutina en lenguaje C.

Responder citando

Las funciones del c usan el generador de frecuencia de la placa que vibra lentamente y con no mucha precisión, mientras que lo que mueve la cpu vibra a una frecuencia muchísimo mayor y, dicen, con precisión total. Hacen falta años para que se desvíe un segundo y todos los pulsos son igual de largos. De hecho las funciones del c usan un chip que está en el puente sur de la placa, y lo de la cpu está en el norte.

La diferencia se notará, y mucho, midiendo tiempos muy cortos, milisegundos o menos. De hecho las funciones de la cpu pueden medir nanosegundos, cosa que el reloj de la placa base no puede.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Sábado 06 Sep 2014 04:19

Título del mensaje: Medir el tiempo de una rutina en lenguaje C.

Responder citando

Hola Pico.
Siempre sostengo que en los foros se leen cosas que no están en todos los manuales, muy buen aporte, muchas gracias.-

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.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda urgente con tarea de programa en lenguaje C

dominicanvictor C, C#, Visual C++ 1 Lunes 05 Ago 2019 18:04 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Traducir algoritmo a lenguaje pascal!

Carlos bayona Programación en general 2 Lunes 01 Jul 2019 20:21 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Debate: ¿Cual es el mejor lenguaje de programac...

Samuel Martinez Programación en general 2 Lunes 10 Jun 2019 09:06 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Necesito ayuda en este codigo en lenguaje c

EmmanuelTR9 C, C#, Visual C++ 0 Lunes 08 Oct 2018 18:38 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,