Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: rihk_ito en 01 de Abril de 2004, 03:11:30 AM

Título: Getcurrenttime
Publicado por: rihk_ito en 01 de Abril de 2004, 03:11:30 AM
 Hola a todos .... resulta que queria comprobar la velocidad de ejecución de dos funciones iguales... pero en una aplicando recursividad y en la otra Iteraciones... y ver la velocidad de cada una de ell.as pero resulta que me aparece ke se tarda 0.000 milisegunmdos... kisiera saber si es ke me pueden ayudar...

Muhcas Gracias

Rich


long factorialR(int n)
{
   if(!n) return 1;
   return (n*factorialR(n-1));
}

long factorialI(int n)
{
   if(!n) return 1;
   long resultado = 1;
   for(int i=1; i<=n; i++)
       resultado*=i;
   return resultado;
}

void main()
{
   int n = 0;
   double inicio, fin;
   while(true)
   {
       printf("Inserte número a calcular\n");
       scanf("%d",&n);
       if(!n) break;
       inicio = GetCurrentTime()/1000;
       printf("Su factorial es %d\n", factorialR(n));
       fin = GetCurrentTime()/1000;
       printf("Factorial Recursivo tardó : %f\n", fin- inicio);
       inicio = GetCurrentTime()/1000;    
       printf("Su factorial es %d\n", factorialI(n));
       fin = GetCurrentTime()/1000;
       printf("Factorial Iterativo tardó : %f\n", fin - inicio);
   }
}


Título: Getcurrenttime
Publicado por: sés en 01 de Abril de 2004, 09:15:45 AM
 Seguramente esos procesos tardan menos de 1 seg (bastante menos), y estás utilizando enteros.

No recuerdo bien, pero supongo que GetCurrentTime() devolverá los milisegundos en un int o long. Luego estás dividiendo entre 1000. Cualquier número menor que 1000, si lo divides por 1000...

Aunque GetCurrentTime() o el resultado de la división fuera real (float o double), se lo estás asignando a una variable entera y perderías los decimales igualmente.

Además de utilizar float o double, te recomiendo usar timeGetTime() (creo que se llamaba así), por que la que usas creo que la resolución que tiene es de 18.2avos de segundo (~54 mseg.), con lo que no vas a medir mucho que se diga.
Título: Getcurrenttime
Publicado por: Zaelsius en 01 de Abril de 2004, 09:28:06 AM
 Si sólo ejecutas una vez cada rutina es normal que no puedas medir con exactitud el tiempo. Deberias ejecutar cada función muchas veces(1000,5000....) y hacer la media aritmética.

Además de eso, la función ::GetCurrentTime está obsoleta, debes usar getTickCount() en su lugar. Pero aun  es mejor usar timeGetTime(), consulta la MSDN para seleccionar la resolución máxima del termporizador(1ms), que por defecto es de 5ms.