• Domingo 17 de Noviembre de 2024, 21:17

Autor Tema:  Reducir Los Tiempos De Ejecucion  (Leído 1013 veces)

alemag

  • Miembro MUY activo
  • ***
  • Mensajes: 180
    • Ver Perfil
Reducir Los Tiempos De Ejecucion
« en: Lunes 25 de Diciembre de 2006, 12:08 »
0
Saludos compañeros, tengo el siguiente codigo que lo que intento hacer es rellenar una lista (l_aleat_pos) con pos cadenas (Strings) y un vector cad_pru_pos con test_pos cadenas (cada cadena puede ser como mucho de longitud l_max), y el metodo calcular_numero_aleatorio tarda menos de un segundo en ejecutarse.
(los caracteres estan en una matriz, y dicha cadena es valida si acaba en una posicion cuya componente este marcada en otro vector como final, como true)
Pues bien, sin cambiar nada de estructuras de almacenamiento he notado que para crear 7 cadenas de cada lista, de longitud maxima 7, tarda alrededor de un minuto, y es mucho tiempo, ya que antes tardaba como mucho 20 segundos. Como lo puedo mejorar ???

  public void obtener_cadenas(LinkedList [][]mat, int l_max, int pos, int neg, int test_pos, int test_neg, int c_alf, Vector est_finales)
  {
    int est=0;
    double prob=0.2;
    String cadena="";
    double prob_cada_estado;
    DefaultListModel modelo_lista_pos=new DefaultListModel();
    DefaultListModel modelo_lista_neg=new DefaultListModel();
    Vector v_cadenas;

   long t1= System.currentTimeMillis();

    while ((l_aleat_pos.getModel().getSize()<pos) && (cad_pru_pos.size()<test_pos))
    {
      while (cadena.length()<=l_max)
      {
        v_cadenas=new Vector();
        new Obtener_caracteres_fila(v_cadenas, mat, est);
        prob_cada_estado=(1-prob)/(v_cadenas.size()-1);
        double num_aleatorio=calcular_numero_aleatorio();
        int casilla_vector;

        if (num_aleatorio>(1-prob)) casilla_vector=v_cadenas.size()-1;
          else casilla_vector=(int)(num_aleatorio/prob_cada_estado);

        if (casilla_vector==v_cadenas.size()-1)
        {
          if (est_finales.get(est).equals(new Boolean(true)))
          {
            if (modelo_lista_pos.size()<pos)
            {
              modelo_lista_pos.addElement(cadena);
              cad_pos.add(new String(cadena));
            }
            else if (cad_pru_pos.size()<test_pos)
            {
              System.out.println(cadena);
              cad_pru_pos.add(new String(cadena));
            }
            est=0;
            cadena="";
          }
          else
          {
            System.out.println(cadena);
            cadena="";
            est=0;
          }
        } // si hay transicion, un caracter de estado a estado
        else
        {
          cadena=cadena+v_cadenas.get(casilla_vector);
          est=calcular_estado_final(mat, est, v_cadenas.get(casilla_vector).toString());
        }
      } // del while de la longitud maxima

      if (cadena.length()>l_max)
      {
        cadena="";
        est=0;
      }
    } // del while

  ....   } // fin del metodo.

Por favor, ayudadme. Muchas gracias.

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Reducir Los Tiempos De Ejecucion
« Respuesta #1 en: Miércoles 3 de Enero de 2007, 09:29 »
0
Hola...

El trabajo con cadenas es muy pesado, porque Java las trata como objetos 'fijos'. Me explico:

String a ="" es igual que String a= new String ("")

De la misma forma:

String a = (String) b + (String) c es lo mismo que String a = new String (a + B);


Si quieres evitar esto, te recomiendo que le eches un vistazo a la clase StringBuffer, que evita estos problemas.

También te recomendaría, para acelerar tu programa, que precalcules las condiciones de los bucles. Guarda en una variable 1 - prob, porque parece que prob es fijo, guarda también objeto.getSize(), objeto.lenght y todo lo que puedas que no vaya a cambiar.


Si estás ejecutando con un interfaz gráfico, el trabajo pesado de cálculo debería de ejecutarse en una hebra aparte, echa un vistazo en internet al tema SwingWorker, que te será de mucha utilidad.

Por último, comprueba que realmente necesitasel DefaultListModel. Esta clase viene de swing e implementa un Vector, así que, si no es realmente necesario, te recomendaría que la cambiases por ésta.

Para consultar más cosas:
http://www.glenmccl.com/jperf/


Espero que te sirva.


Un saludo.