Duda sobre codigo Eficiencia

Iniciado por lexoazul, 30 Agosto 2010, 23:51 PM

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

lexoazul

Hola a todos, la verdad que tengo una gran duda me dejaron un trabajo de la escuela pero quisiera que me ayudaran para poder realizarla.
El problema es que tengo que contar cuanta eficiencia tiene un codigo
Es decir por cada asignacion,operacion aritmetica o logica tiene un valor de 2 nanosegundos. por ejemplo en una asignacion de variable:

int x=0;      //Esta asignacion tiene un valor de 2 nanosegundos

El problema es en un for ejemplo:
int y = 5;         //2 nanosegundos
for(int i=0;x<y;i++){     //aqui llevo 6 nanosegundos
}                                  //total 8 nanosegundos 


El principal problema es que el codigo lo tengo que leer desde un .txt; es decir la duda es saber cuantos nanosegundos van hacer, considerando que en cada ciclo del for son 8 nanosegundos; osea en total por le for de arriba seran 40 mas la asignacion de la variable y.

Les agradeceria mucho por su ayuda. Nuevamente gracias

Debci

Donde conseguiste exactamente esos valores?
Es parte de un trabajo de Cómputo?
Si te digo la verdad estas cosas solo las habia hecho con C pero si me dices donde hay una lista con los tiempos o una documentación al respecto, prometo ayudarte en lo que me sea posible.

Saludos

egyware

Cita de: lexoazul en 30 Agosto 2010, 23:51 PM
int x=0;      //Esta asignacion tiene un valor de 2 nanosegundos
El problema es en un for ejemplo:
int y = 5;         //2 nanosegundos
for(int i=0;x<y;i++){     //aqui llevo 6 nanosegundos
}                                  //total 8 nanosegundos 


Hola

Dudo que ese for dure en total 8 nanosegundos, no me refiero el valor si no por la condicion que se se repite hasta que el programa se cierre.

Primero te recomiendo que derives la complejidad del algoritmo
por ejemplo
Código (java) [Seleccionar]

for (int i=0;i<10;i++){
//algo de ejecución constante 1
}

Eso como intera n veces siempre osea el algoritmo es de orden O(n) con n = 10.
Como ya sabemos el orden de complejidad, asumo que cada instruccion se demora 2 nanosegundos, entonces tengo en total que ese simple for se demorara n * 2 ns, con n = 10 osea 20 nanosegundos.

Saludos espero que me hayas entendido


lexoazul

gracias por contestar.
Bueno los datos del tiempo en cuanto va a tardar lo asigne es decir; solo dije que por cada asignacion va a tardar 2 nanosegundos.

consideracion:
por cada asignacion(=) tardara 2 nanosegundos.
por cada operacion aritmetica(+,-,/,*) tardara 2 nanosegundos.
por cada operacion logica(|,&,++) tardara 1 nanosegundo.
Solo lo designamos al azar.

Como decia en el ejemplo del for
for(int i=0;i<10;i++)
{
}

considerando que en cada ciclo del for son 6 nanosegundos; osea en total por el for de arriba seran 60.

es decir por el int = 1  //son dos nanosegundos
el i<10   //seran 2 nanosegundos
y el i++    //seran 2nanosegundos
en total por el primer ciclo seran 6 nanosegundos
por los 10 ciclos seran entonces 60 nanosegundos.

Espero haya quedado claro el ejemplo.
bueno el principal problema es que el codigo lo tengo que leer desde un .txt
y mi programa(hecho en java) debe de contar el total del tiempo en que va a tardar todo el proceso(tomando encuenta las consideraciones de arriba).

Estaba pensando en leer todo el codigo y dividirlo por caracter; despues ir buscando el simbolo de asignacion(=), o el de alguna operacion aritmetica(+,-,/,*)
y ya que lo encontrara, iria sumando el tiempo. Como decia el problema es en un for porque tengo que tener encuenta que son varios ciclos y no se como decirle eso a mi programa.

Gracias egyware y Debci, Espero me hayan entendido y claro espero me sigan ayudando, estare pendiente sobre el tema.
Gracias por su ayuda.

egyware

Ohhhh osea tu tienes que leer el programa y todo =S
vaya que dificil
Por lo que entendí debes leer y entender el programa dentro del txt, osea hacer un interprete D:
Por lo menos mucho no te puedo ayudar.

Podrias usar analizadores de sintaxis aunque desconozco si pueden servirte como realmente funcionan como Bison, ANTLR, Lex, Yacc
http://en.wikipedia.org/wiki/Parsing

Saludos

[D4N93R]

Pero eso es relativo, por qué no le dices a tu profe que eso no funciona :P

La mejor forma de hacerlo sería la diferencia de tiempo y correrlo unas 10 veces, eliminar el record más bajo y el más alto, para luego sacar un promedio. Algo así sería ideal. Ya que si por ejemplo, de la manera como tú lo haces, en el for haces una condición y si es verdadero haces i-- ya se comienza a hacer casi imposible medir el rendimiento de esa manera.

Saludos!

Leyer

#6
No esta dificil con tan pocas consideraciones, si tratas con strings no habrá problemas, otra cosa es cuarquier fuente que leera o un fuente ya propuesto?  

lexoazul

gracias a todos.
CitarNo esta dificil con tan pocas consideraciones, si tratas con strings no habrá problemas

como que consideraciones serian? pensaba en eso que sea puros string y despues separarlos caracter por caracter y guardarlo en un arreglo para luego ir comparando con las consideraciones antes mencionadas.

Es una fuente ya propuesta ejemplo:
public class InsercionDirecta
{
int v;
public InsercionDirecta()
{
}
public void pasadas(int []A)
{
int n=A.length;
for(int i=0;i<n;i++){
int v=A[i];
int j=i-1;

            while (j >= 0 && A[j] > v)
          {
                  A[j + 1] = A[j];
                  j--;
          }
                A[j + 1] = v;
         
        }
       
        for(int r=0;r<A.length;r++){
          System.out.print(A[r]+",");
             }
}
public static void main(String arg[])
{
        int[]b={7,3,9,40,5,3,2,6};
InsercionDirecta id=new InsercionDirecta();
id.pasadas(b);
}

}

de este codigo voy a determinar con las consideraciones.
consideracion:
por cada asignacion(=) tardara 2 nanosegundos.
por cada operacion aritmetica(+,-,/,*) tardara 2 nanosegundos.
por cada operacion logica(|,&,++) tardara 1 nanosegundo.



Dznp

Hola! :D

Te recomendaría que aclares que tipo de codigo necesitarias verificar, si el source de un programa o un simple txt que tenga 3 variables y un for.

Quizas te podamos ayudar así.

Suerte.

lexoazul

Es un txt que tiene el siguiente codigo
public int sumar(){
int numero;
int suma;
for (numero = 1 ;numero <= 100 ;numero++)
suma = suma+numero
return  suma;
}


Este es el codigo que tengo que verificar.