elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pequeña Duda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pequeña Duda  (Leído 1,793 veces)
alexis33de

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Pequeña Duda
« en: 29 Junio 2011, 17:40 pm »

Hola que tal , veran la duda que tengo es como sacar el tiempo de ejecucion de un algoritmo. En el codigo que puse, implemente un tiempo con la libreria time.h, y quise ver el tiempo que me demoraba esa simple multiplicacion que hice, ahora quisiera que me dijeran si esta bien como obtengo el tiempo, o de que manera seria?. Cuando lo ejecuto me sale varios tiempos, se que esto depende de los procesos que este haciendo en ese momento la pc.
Código
  1. #include <conio.h>
  2. #include <iostream.h>
  3. #include <time.h>
  4. #include <stdio.h>
  5.  
  6. void main()
  7. {
  8. int numero1,numero2,resultado;
  9. double total;
  10. clock_t inicio, final;
  11.  
  12. inicio=clock();
  13.  
  14. cout<<"COloque el 1er numero";
  15. cin>>numero1;
  16. cout<<"Coloque el 2do numero";
  17. cin>>numero2;
  18.  
  19. resultado=numero1*numero2;
  20. cout<<"El resultado es:" <<resultado<<endl;
  21. final=clock();
  22. printf("El Tiempo es: %f\n",(final - inicio)/CLK_TCK);
  23. cout<<endl<<endl;
  24. total=(final-inicio)/(double) CLOCKS_PER_SEC;
  25. cout<<total<<endl;
  26. getch();
  27. }


En línea

Edu


Desconectado Desconectado

Mensajes: 1.082


Ex XXX-ZERO-XXX


Ver Perfil
Re: Pequeña Duda
« Respuesta #1 en: 29 Junio 2011, 20:57 pm »

Pero esque el inicio = clock(); tendrias que ponerlo despues de que ya ingreso los datos y antes de la multiplicacion, porqe sino todo depende de cuan rapido escribes el numero y pones enter.
Eso que nos pones talvez es un ejemplo, y si vs lo queres usar en un bucle es ponerlo al principio y enseguida al final ( siempre afuera)


En línea

Acermax

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Pequeña Duda
« Respuesta #2 en: 30 Junio 2011, 01:00 am »

Un par de cosas.

Lo primero es que para medir el tiempo, no puedes realizar una vez el algoritmo y mirarlo, porque en un cálculo tan simple que tarda una fracción de tiempo minúscula en hacerla no tendrás ningún resultado.

Deberías repetir el algoritmo, por ejemplo, 100.000 veces, y luego ya dividir el resultado entre 10.000 para tener algo verdadero.

El problema, es que aún así, con ese algoritmo el resultado que te va a dar es siempre 0, es demasiado simple y no tarda "nada" en hacerlo. Te voy a poner unos ejemplos que tengo aquí de hace unos años en clase, con 3 funciones diferentes.


El primero, es una búsqueda secuencial
Código
  1. #include <vector>
  2. #include <iostream>
  3. #include <time.h>
  4. using namespace std;
  5.  
  6. int Secuencial (vector <int> &A, int x, int n){
  7. int i=0;
  8. while (i<n&&A[i]!=x){
  9. i++;
  10. }
  11. return i;
  12. }
  13.  
  14.  
  15. int main(){
  16. vector <int> v(972000,0);
  17.    float mejor, peor;
  18.  
  19.    float ini,fin,tiempo;
  20.  
  21.    cout << "Busqueda secuencial" << endl << endl;
  22.    cout << "Talla" << "\t\tMejor caso" << "\t\tPeor caso" << endl;    
  23.    cout << "-----\t\t----------\t\t---------"<<endl;
  24.    int talla[6]={4000, 12000, 36000, 108000, 324000, 972000};
  25.    int repeticiones=10000;
  26.    int i, j;
  27.    for (i=0;i<6;i++){
  28.        v.resize (talla[i],0);
  29.        ini=clock();
  30.        for (j=0;j<=repeticiones-1;j++){
  31.            Secuencial (v,0,talla[i]);
  32.            }
  33.            fin=clock();
  34.        mejor=(fin-ini)*1000/CLOCKS_PER_SEC/repeticiones;
  35.        ini=clock();
  36.        for (j=0;j<=repeticiones-1;j++){
  37.            Secuencial (v,1,talla[i]);
  38.            }
  39.            fin=clock();
  40.        peor=(fin-ini)*1000/CLOCKS_PER_SEC/repeticiones;
  41.        cout << talla[i] << "\t\t" << mejor << "ms\t\t\t" << peor<<"ms" <<endl;
  42.        }
  43. }
  44.  
En este caso tienes el mejor y peor caso, los tiempos de mejor caso serían más o menos lo que tardaría tu algoritmo, que es encontrar el valor en el primer lugar del array.

Algoritmo de la sucesión de Fibonacci (lo llamo rayuela porque es un juego infantil, aunque es el mismo algoritmo).
En este algoritmo si se ven tiempos reales, al tratarse de una función recursiva MUY poco eficiente.
Código
  1. #include <time.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int Rayuela_Recursiva(int);
  7. int main(){
  8.  
  9.    int n=4, i, j, repeticiones=1;
  10.    int talla[4]={10, 20, 30, 40};
  11.    float ini, fin, tiempo;
  12.    cout<<" Talla\t\t\tTiempo\n";
  13.    cout<<" -----\t\t\t---------\n";
  14.    for(i=0;i<n;i++){
  15.            ini=clock();
  16.            for(j=1;j<=repeticiones;j++)
  17.                    Rayuela_Recursiva(talla[i]);
  18.            fin=clock();
  19.            tiempo=((fin-ini)/repeticiones)/CLOCKS_PER_SEC;
  20.            cout<<"  "<<talla[i]<<"\t\t\t"<<"  "<<tiempo<<" s\n\n";
  21.    }
  22. return 0;
  23. }
  24.  
  25. //Orden de complejidad O(2^n)
  26. int Rayuela_Recursiva(int n){
  27.    if(n==1||n==2) return n;
  28.    else return Rayuela_Recursiva(n-1)+ Rayuela_Recursiva(n-2);
  29. }
  30.  

El mismo algoritmo, pero con un orden de complejidad lineal.

Código
  1. #include <time.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. //Orden de complejidad O(n)
  7. int Rayuela_Iterativa (int n){
  8. int a=1, b=2;
  9. for (int i=0;i<n-2;i++){
  10. b=a+b;
  11. a=a-b;
  12. }
  13. return b;
  14. }
  15.  
  16. int main(){
  17.  
  18.    int n=6, i, j, repeticiones=10000;
  19.    int talla[6]={4000, 12000, 36000, 108000, 324000, 972000};
  20.    float ini, fin, tiempo;
  21.    cout<<" Talla\t\t\tTiempo\n";
  22.    cout<<" -----\t\t\t---------\n";
  23.    for(i=0;i<n;i++){
  24.            ini=clock();
  25.            for(j=1;j<=repeticiones;j++)
  26.                    Rayuela_Iterativa(talla[i]);
  27.            fin=clock();
  28.            tiempo=(((fin-ini)*1000/repeticiones)/CLOCKS_PER_SEC);
  29.            cout<<"  "<<talla[i]<<"\t\t\t"<<"  "<<tiempo<<" ms\n\n";
  30.    }
  31. return 0;
  32. }
  33.  

Espero que te sirva de algo este tocho xd
« Última modificación: 30 Junio 2011, 02:25 am por Acermax » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una pequeña duda....
Software
Viequense 3 2,259 Último mensaje 3 Agosto 2004, 08:41 am
por Luis_Kano
;D Pequeña duda
Diseño Gráfico
RastonE 3 3,903 Último mensaje 13 Octubre 2005, 21:20 pm
por Morris
Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
Scripting
revenge1252 9 9,746 Último mensaje 13 Febrero 2008, 21:41 pm
por revenge1252
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines