• Miércoles 20 de Noviembre de 2024, 10:32

Autor Tema:  Problema De Performance  (Leído 1555 veces)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Problema De Performance
« en: Lunes 18 de Septiembre de 2006, 18:19 »
0
Saludos,
por diferentes circunstancias debo tener un procedimeinto de la siguiente forma:

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
public Valor[] ObtenerListaNueva(valorEntrada[] lista1,
                                            valorEntrada[] lista2)                                                          
{
    List<Valor> listaSalida = new List<Valor>();
    
    foreach (valorEntrada val in lista2)
    {
        for (short i = 0; i < lista1.Length; i++)
        {
            if (val.subValor == lista1[i].subValor)
            {
                listaSalida.Add(new Valor(val.numero, i));
                break;
            }
        }
    }
    return listaSalida.ToArray();
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

La idea es que se debe formar una lista de salida a partir de las listas que entran como parametro.

Actuialmente tengo una version levemente mas optimizada en tiempo pero apenas me da unos segundos de diferencia.

En la prueba que estoy haciendo lista1 tiene 66.000 registros y la lista 2 tiene 17.500.

Otros procesos similares los he optimizado y he rebajado de 40 segundos a 0 segundos, pero este proceso en especial no se por donde atacarlo para hacerlo notoriamente mas rapido. Actualmente ese proceso tarda unos 12 segundos compilando en modo release. Valga aclarar que los campos 'subValor' son instancias de clases relativamente pequeñas que ya tren una sobercarga de los operadores que permiten eralizar dichas comparaciones.


Gracias por su ayuda.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Problema De Performance
« Respuesta #1 en: Lunes 18 de Septiembre de 2006, 19:24 »
0
Segun entiendo, la lista de salida tiene los elementos repetidos de las dos listas de entrada.

¿Que tipo de cosas tienen las listas de entrada? Si son numeros, podrías ordenarlos de menor a mayor  y en vez de recorrer toda la lista buscando elementos repetidos, tan solo revisas en ciertos rangos.
(si mal no recuerdo, se llama busqueda binaria)

No conozco de performance, pero el código que escribiste tiene una efectividad de N2 que es de lo peor que puede haber.  En el link que coloqué, la eficacia es de N(ln N). Pero creo que solo sirve con numeros y palabras.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Performance
« Respuesta #2 en: Lunes 18 de Septiembre de 2006, 19:31 »
0
Si eso lo se, pero aun no veo la luz de como mejorarlo notoriamente, en los demas casos que tuve los mejoré en fecto usando un ordenamiento anterior a la busqueda en uno o algunos de los vectores involucrados.

La idea es que la lista resultante siempre es del mismo tamaño que la lista2.

En cada nodo de la lista2 se debe buscar su 'subvalor' en la lista 1,
en la lista 1 no hay elementos repetidos. cuando se encuentra el valor de la lista 1 en la lista 2 se crea un nuevo nodo en la lista de salida de acuerdo a los valores que coincidieron en la busqueda.

La lista 1 esta ordenada en efecto pero no es por el criterio de comparacion sino por otro criterio diferente de acuerdo a ua estiomacion que me dice cual valor de la lista 1 aparece mas veces en la lista 2, de tal forma que en este caso siempre encuentra mas facil y rapido los elementos comunes que los poco comunes.

EL otro 'pero ' para poder hacer busqueda binaria es que el array de resultados debe conservar los valores en el mismo orden que lista2 y lista2 no puede cambiar su orden pues funciona a manera de indice de valores contenidos en otra lista fuera de proceso.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Performance
« Respuesta #3 en: Lunes 18 de Septiembre de 2006, 20:46 »
0
:@ bueno por el momento he tomado la sugerencia de enko para implementar la busqueda binaria en vista de que no han habido mejores propuestas y a mi no se me ocurre nada mas tampoco.

El problema es que tal como estan las estructuras, especificamente lista1 no es factible implementarlo en el momento y modificarla y llenarla con el campo adicional que pienso incluir tiene un impacto negativo y representativo en otros componentes del software.  :angry:

Tampoco se que tanto mas rapido quede al final respecto a la version ya optimizada que les conte que tenia.

Pero bueno, este fin de semana trataré de sacarle tiempo a eso, o si se puede antes.

quedo abierto a recibir mas sugerencias.  :smartass:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Performance
« Respuesta #4 en: Lunes 18 de Septiembre de 2006, 23:31 »
0
ME VAN A HECHAR DEL TRABAJO.!!!

Bueno no pude contenerme y me puse a codificar eso en tiempo de oficina.

Bien como no podia cambiar lo que tenia puesto que tenia codigo dependiente de esa implementacion ---

bien ese codigo era para performance y tunnig en otros modulos, pero era ajustes menores que en el caso del ejemplo tenian una relevancia de centesimas de segundo sobre el total.... mientras que el problema aca era muchisisimo mas representativo.

Asi que hice lo que me dicto el corazon... reimplemente, borre, adicione...

bien quedo asi ( por el momento pues es version beta por estar en la oficina, aunque ya probe que funciono me toca resstructurar algunas cosas).

Como esa parte del FrameWork aun tiene cosas de la version 1.1 y no le han incluido cosas del 2 tuve que crear una clase
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->

 public class ComparaNumxx: IComparer<Valor>
        {
            public int Compare(Valor x, Valor y)
            {
                if (x == y)
                    return 0;
                else if (x > y)
                    return 1;
                else
                    return -1;
            }
        }
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

ya con eso:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
public Valor[] ObtenerListaNueva(valorEntrada[] lista1,
                                           valorEntrada[] lista2)                                                          
{
   ComparaNumxx comparador =  new ComparaNumxx();
   valorEntrada[]  listSort = new valorEntrada[lista1.Length];
   List<Valor> listaSalida = new List<Valor>();
   Array.Copy(lista1, listSort, lista1.Length);
   Array.Sort(listsort, comparador);
   Int32 indiceEncontrado=0;  

   foreach (valorEntrada val in lista2)
   {
       indiceEncontrado = Array.BinarySearch<valorEntrada>(listSort, val , comparador);
       if (indiceEncontrado >= 0)
         listaSalida.Add(new Valor(linea.numeroRepeticiones,
                         (Int16)listSort [indiceEncontrado].consecutivoDeLista));      
   }
   return listaSalida.ToArray();
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

donde consecutivoDeLista es un atributo nuevo que se llena en otras clases y pque permite conocer el numero original del indice antes de ser ordenado el vector para aplicarle la busqueda binaria.

Bueno despues de lo estructure como se debe quedara aun mas rapido pues nuas cosas que coloque en ese metodo realmente deben quedar en otro...  :whistling:  pero eso lo hago esta noche :P

El tiempo con la mejora actual es = 0seg.

los dejo porque enserio me van a hechar..!!!!
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Performance
« Respuesta #5 en: Lunes 18 de Septiembre de 2006, 23:58 »
0
Ahh lo olvidaba, lo más importante!!!


gracias Enko   :guitar:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io