• Domingo 22 de Diciembre de 2024, 14:21

Autor Tema:  Performance  (Leído 4023 veces)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Performance
« en: Miércoles 11 de Octubre de 2006, 14:51 »
0
Saludos,

Tengo una duda acerca de cual de estas dos instrucciones es mas rapida ya que las necesito en un proceso que se ejecuta miles de veces .

Código: Text
  1.  
  2. int variableA....
  3. ....
  4. ...
  5.  
  6. int variable= (byte)((variableA & 0x1C) >> 2);
  7. //---------------------------------------------
  8. int variable= (byte)((variableA << 3 ) >> 5);
  9.  

El punto es que en variable deben quedar solo los bits  3,4,5 de la variable variableA.

Ya he probado ambos y ambos me funcionan produciendo los resultados esperados pero me interesa saber cual tiene un mejor desempeño en el procesador y desde luego cual es la razon de la respuesta.


Gracias.
[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: Performance
« Respuesta #1 en: Miércoles 11 de Octubre de 2006, 15:17 »
0
Según tengo entendido, AND consume menso ciclos que SHR o SHL.

Fijate en esta página (el link lo paso Eternal Idol para no desacreditarle el merito):

http://home.comcast.net/~fbui/intel.html

Siguiendo lo que dice las tablas de la página, AND segun que operandos esten en juego, cosume promedio 2 ciclos, mientras que los SHL algo de 5.
ROR algo de 4.

lo que no se, es si "<<" es SHL o ROL pero aun asi, tardan mas que AND.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Performance
« Respuesta #2 en: Miércoles 11 de Octubre de 2006, 15:25 »
0
Bueno ese es un buen dato, vere si hay documentacion para procesadores Pentium y  posteriores que son mi objetivo mas general .

SHL   :rolleyes: ? debe ser << porque no conozco nada en C/C++/C# que haga ROL alguien sabe de alguno?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Performance
« Respuesta #3 en: Miércoles 11 de Octubre de 2006, 15:31 »
0
Es SHL pero todo esto es en C/C++ no se que hara en C#:

mov        eax,dword ptr [ebp-8]
and         eax,1Ch
sar          eax,2

movzx     ecx,al
mov        dword ptr [ebp-4],ecx

mov        edx,dword ptr [ebp-8]
shl          edx,3
sar          edx,5

movzx     eax,dl
mov        dword ptr [ebp-0Ch],eax

De cualquier manera lo mejor es que lo pruebes, con algun bucle que tarde lo suficiente para ver la diferencia real.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Performance
« Respuesta #4 en: Miércoles 11 de Octubre de 2006, 15:40 »
0
OK, bueno he hecho pruebas que tardan hasta 4 segundos con bitmaps uno de

955 * 581 * 3 = 1.58 mb

y otro

868 * 979 * 3 = 2.43 mb

es decir la prueba la hice con los dos al tiempo ( 4.01 mb).

pero mi objetivo es que no tarden ni un segundo, maximo uno.

bueno encontre esto que no me aclara mucho el panorama porque aun hay diferencia.

Seguire tu consejo y vere si puedo en un rato sacar algo de tiempo para un bitmap grande.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
[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: Performance
« Respuesta #5 en: Miércoles 11 de Octubre de 2006, 16:47 »
0
Bueno, nmo he encontrado diferemcias visibles con dos bmp de 1440 * 900 * 3  :blink:


asi que dejare cualquiera de los dos.


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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Performance
« Respuesta #6 en: Miércoles 11 de Octubre de 2006, 16:54 »
0
Cita de: "JuanK"
Bueno, nmo he encontrado diferemcias visibles con dos bmp de 1440 * 900 * 3  :blink:


asi que dejare cualquiera de los dos.


gracias.
Entonces probablemente esto no se ejecute miles de veces seguidas sino espaciadas  :scream:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pabloreda

  • Miembro MUY activo
  • ***
  • Mensajes: 125
    • Ver Perfil
    • http://www.reda4.org
Re: Performance
« Respuesta #7 en: Miércoles 11 de Octubre de 2006, 17:44 »
0
Amigo JuanK..
fijate en esta pagina, seguramente te puede ayudar en algo...

http://www.azillionmonkeys.com/qed/optimize.html

A veces conociendo un poco mas del problema se puede encontrar una solucion alternativa.. por ejemplo tomando de a 32 bits en vez de 8 podes acelerar el proceso...

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Performance
« Respuesta #8 en: Miércoles 11 de Octubre de 2006, 20:56 »
0
Gracias por los consejos.

Bueno he revisado el codigo paso por paso y si bien esa parte toma una parte considerable del tiempo, no es la mas representativa.

Habia pasado por alto algunos detalles y resulta que el problema principal es cuando trato de importar un archivo bmp para convertirlo en un cuadro de mi formato de archivo, puesto que el formato BMP tiene formato de color BRG y el mio tiene formato color RGB asi que lo que haga es extraer los colores del BMP y crear un array de colores en el formato correcto...hace esto:

Código: Text
  1.             for (int i = 0; i &#60; bmpArr.Length; i += bytesPorPixel)
  2.             {
  3.                 colorArray[j] = new T();
  4.                 colorArray[j++].FromBMPColorArray( bmpArr, i);
  5.                 if (j % bmp.Width == 0)
  6.                     i += paddedBytes;
  7.             }
  8.  

Para el ejemplo de las imagenes citadas anteriormente este ciclo iteraria 2'592.000 veces, y el tamaño de bmpArr seria más de 7'776.000 bytes.

donde

T es un tipo generico de Color, el constructor vacio no hace nada
colorArray es un T[]
bmpArr es un byte [] con la informacion de los bytes del bmp, incluyendo los bytes de padding
FromBMPColorArray es un metodo que extrae un color del array del bmp y lo convierte al color con formato RGB.. es decir para el caso de un color de 24 bits hace:

Código: Text
  1.         /// &#60;summary&#62;
  2.         /// Crea un Color de 24 bits a partir de un array de bytes
  3.         /// &#60;/summary&#62;
  4.         /// &#60;param name=&#34;arrByte&#34;&#62;Array de bytes que representa un color de un BMP&#60;/param&#62;
  5.         /// &#60;param name=&#34;starIndex&#34;&#62;Indice desde el cual se inicia la extraccion del color&#60;/param&#62;
  6.         public override void FromBMPColorArray(byte[] arrByte, int starIndex)
  7.         {
  8.             rojo = arrByte[starIndex + 2];
  9.             verde = arrByte[starIndex + 1];
  10.             azul = arrByte[starIndex];
  11.  
  12.             baseType = rojo &#60;&#60; 16 | verde &#60;&#60; 8 | azul;
  13.         }
  14.  

baseType es un Int32 que representa el color.

La verdad no tengo ni la mas remota idea de como optimizarlo más. Acepto cualquier sugerencia por descabellada que sea ( pero que sea posible de hacer)  :blink:  :lol:

Gracias!!!
[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: Performance
« Respuesta #9 en: Miércoles 11 de Octubre de 2006, 21:00 »
0
¿Que tal mantener BGR?
 :scream:

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Performance
« Respuesta #10 en: Miércoles 11 de Octubre de 2006, 21:03 »
0
&lt;_&lt;  no tomare eso como una opcion  :lol:  de no poder al final hacer nada preferiria dejar lo así.  :(

Ademas en todo caso deberia extraer la informacion del bmp y copiarla en un arreglo propio de objetos tipo T  /* color*/ y ya sin padding.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

pabloreda

  • Miembro MUY activo
  • ***
  • Mensajes: 125
    • Ver Perfil
    • http://www.reda4.org
Re: Performance
« Respuesta #11 en: Miércoles 11 de Octubre de 2006, 21:47 »
0
a ver si entiendo...

en bmparr esta la imagen que convertiste del archivo que cargaste..

* generalmente conviene tomar los colores como 32bits y listo , no importa si desperdicias porque usas 24 bits, si este arreglo esta alineado mejor.
conviene evitar los metodos virtuales, ya que estas decidiendo EN TIEMPO DE EJECUCION lo que podrias decidir antes, si no te queda otra inclusive te combiene hacer una funcion para cada tipo deconversion 16->32 24->32 32->32 y elegirla ANTES de entrar en cualquier bucle..
* ya que sabes que vas a usar memoria para guardar esta imagen porque no la haces global ( y sin new o delete), simplemente como estatica...
* evitar el uso de indices, quizas el pinche compilador lo optimize pero siempre es mejor controlar esto... UTILIZAR puntero !!!!
El puntero es el metodo mas veloz y directo para recorrer memoria
* evitar los contadores si tenes un puntero !!! y ya que esta indicarle al puntero que sea un registro !!!

Código: Text
  1.  
  2. int bmpcargado[IMAGENMASGRANDE];
  3. int bmpconvertido[LOMISMO];
  4.  
  5. void convertir(void)
  6. {
  7. register int *pimg=bmpcargado;
  8. register int *pdes=bmpconvertido;
  9. int *pultimo=bmpcargado+tamanio;
  10. for (;pimg&#60;pultimo;pimg++,pdes++)
  11.   *pdes=((*pimg&0xff0000)&#62;&#62;16)|(*pimg&0xff00)|(*pimg&0xff)&#60;&#60;16);
  12.  
  13. }
  14.  
  15.  
quizas tiene algun error, yo ya no programo en C ;) pero bueno...
una duda... C# todabia tiene puntero ??? espero que si

espero te ayude...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Performance
« Respuesta #12 en: Jueves 12 de Octubre de 2006, 00:15 »
0
En vez de usar memoria estatica que es una practica de programacion pesima podrias tratar de reservar directamente toda la memoria necesaria para ese bitmap y no linea por linea.

Using the register keyword in strategic places C will improve performance substantially.
This keyword is a complete placebo in most modern C compilers.


Realmente hay una altisima probabilidad de que esto sea una perdida de tiempo absoluta. No tiene sentido intentar hacer esto con C# ya que no es la herramienta adecuada, si lo es para que el programa llegue a buen puerto y sea completado en el menor tiempo posible, con la mayor simplicidad y con gran posibilidad de reutilizar el codigo generado y que este sea generado en gran parte de la misma forma pero estas ventajas (entre otras mas) se vuelven desventajas a la hora de optimizar ya que se pierde el control del codigo generado.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Performance
« Respuesta #13 en: Jueves 12 de Octubre de 2006, 00:42 »
0
Cita de: "pabloreda"
quizas tiene algun error, yo ya no programo en C ;) pero bueno...
una duda... C# todabia tiene puntero ??? espero que si

espero te ayude...
Si, C# tiene punteros..
sin embargo tu alternativa presenta un alto impacto en el codigo fuente dependiente de ese modulo...
vere si puedo hacer algo hibrido o que se yo.

Citar
Realmente hay una altisima probabilidad de que esto sea una perdida de tiempo absoluta. No tiene sentido intentar hacer esto con C# ya que no es la herramienta adecuada, si lo es para que el programa llegue a buen puerto y sea completado en el menor tiempo posible, con la mayor simplicidad y con gran posibilidad de reutilizar el codigo generado y que este sea generado en gran parte de la misma forma pero estas ventajas (entre otras mas) se vuelven desventajas a la hora de optimizar ya que se pierde el control del codigo generado.

Claro tienees mucha razon, para cosas de mision critica nda como C++/C y asm  :rolleyes:

pero en todo caso no me dare por vencido.

espero poder hacer algo.

luego les cuento.
[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: Performance
« Respuesta #14 en: Lunes 16 de Octubre de 2006, 23:03 »
0
Bueno, tengo algunos ajustes en mente para hacer...
pero mientras, y antes de empezar en forma ( estaba de viaje) quisiera saber algo.

que tan importante es el consumo de memoria a la hora de medir el performance en millones de ciclos?

Si tengo una clase X con campos y metodos que tan mas eficiente seria dejar todos sus metodos esticos versus versiones diferentes de los mismos metodos pero no estaticos?

Es decir reservar 2'500.000 porciones de memoria de tamaño N/x es más rápido que reservar 2'500.000 porciones de memoria de tamaño N?  :rolleyes:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Performance
« Respuesta #15 en: Lunes 16 de Octubre de 2006, 23:38 »
0
Cita de: "JuanK"
que tan importante es el consumo de memoria a la hora de medir el performance en millones de ciclos?

Puede que en C# incluso mas que en C++ debido a la recoleccion de basura cuantas mas reservas mas comprobaciones ... es por pura logica.

Cita de: "JuanK"
Si tengo una clase X con campos y metodos que tan mas eficiente seria dejar todos sus metodos esticos versus versiones diferentes de los mismos metodos pero no estaticos?

Una comprobacion mirando codigo es lo que deberias hacer.

Cita de: "JuanK"
Es decir reservar 2'500.000 porciones de memoria de tamaño N/x es más rápido que reservar 2'500.000 porciones de memoria de tamaño N?  :rolleyes:

Depende de la implementacion ... pero seguro que 2.500.000 de X son mas lentas que 625.000 de X*4 ... menos llamadas menos codigo ejecutado ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Performance
« Respuesta #16 en: Martes 17 de Octubre de 2006, 00:00 »
0
Si eso he visto en las pruebas que he realizado hoy... ahora solo me falta averiguar como demonios hago en C# para reservar un bloque de memoria y asignarlo aun lote de 'punteros' que se encuentran un array  &lt;_&lt;

thanks
[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: Performance
« Respuesta #17 en: Martes 17 de Octubre de 2006, 17:44 »
0
:o

Haicendo averiguaciones y pruebas , resulta que hacer la misma implementacion usando tipos como clases o estucturas, la instanciacion de 2'500.000 elementos es casi inmediata, como 1/2 segundo mientras que usado generics ( el equivalente a templates en c++, el cual es mi caso) toma casi 5 segundos.  :(  tal como lo dijo eternal idol se acelera el tiempo de desarrollo pero con un costo de performance adicional.

Estas cifras las obtuve tambien en un foro de Microsoft:
Citar
new int(): 0.006 microseconds
new T() where T is int: 0.030 microseconds
new class(): 0.042 microseconds
new T() where T is class: 2.0 microseconds

Este es el link:

http://forums.microsoft.com/MSDN/ShowPost....SiteID=1&mode=1

No acepto burlas por mi ingles, pues apenas estoy aprendiendo.

Bueno por el momento no se que hacerle , si bien es un tiempo significativo lo puedo considerar como despreciable puesto que esta por demas decir que esta por fuera de mi scope ya que el formato va dirigido a animaciones para videojuego y dificilmente algun cuadro de animacion llegara a ese tamaño de imagen, de hecho ni a la mitas de ese tamaño con el cual hice las pruebas, sin embargo si se me ocurre algo como lo del pool de tipos T pues puede que llegue a implementarlo.

Hablamos.  :hola:
[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: Performance
« Respuesta #18 en: Martes 17 de Octubre de 2006, 19:44 »
0
:ph34r:

He solucionado el problema de velocidad  :)  &lt;_&lt;

Pero desde luego no fue precisamente una solucion muy limpia, por el contrario bastante sucia.

Como el problema es por usar generics decidi reducir su uso al maximo en ese metodo porblema, asi que lo que hice fue determinar el tipo T e implementar una solucion especifica para los tipos soportados por mis formatos nativamente (8,16,24,32 bit) y conservar la interfaz generica para los clientes del metodo asi como proveer una solucion generica para los tipos no nativos que se requieran utilizar en un futuro.

Reduje el tiempo de ejecucion a menos de un segundo.  :lol:

Codigo anterior:

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
        public T[] ColorArrayDesdeBMP(Bitmap bmp)
        {
            T[] colorArray = new T[bmp.Height * bmp.Width];
            BitmapData bmpd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
            IntPtr pbmp = bmpd.Scan0;
            byte bytesPorPixel = 0;
            int j = 0;

            bytesPorPixel = (byte)((int)imagen.informacionBase.ProfundidadColor / 8);
            int anchoEnBytes = bmp.Width * bytesPorPixel;
            int paddedBytes = ((anchoEnBytes + 3) & ~3) - anchoEnBytes;
            int anchoBytesPadd = anchoEnBytes + paddedBytes;
            byte[] bmpArr = new byte[bmp.Height * anchoBytesPadd];

            System.Runtime.InteropServices.Marshal.Copy(pbmp, bmpArr, 0, bmp.Height * anchoBytesPadd);
            bmp.UnlockBits(bmpd);

            for (int i = 0; i < bmpArr.Length; i += bytesPorPixel)
            {
                colorArray[j] = new T();
                colorArray[j++].FromBMPColorArray(bmpArr, i);
                if (j % bmp.Width == 0)
                    i += paddedBytes;
            }

            return colorArray;
        }<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Codigo nuevo (cochino pero rapido)


<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->        public T[] ColorArrayDesdeBMP(Bitmap bmp)
        {
            BaseColor[] objectArray = new BaseColor[bmp.Height * bmp.Width];
            T[] colorArray= new T[1];
            Color8[] colorArray8 = new Color8[1];
            Color16[] colorArray16 = new Color16[1];
            Color24[] colorArray24 = new Color24[1];
            Color32[] colorArray32 = new Color32[1];

            BitmapData bmpd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
            IntPtr pbmp = bmpd.Scan0;
            byte bytesPorPixel = (byte)((int)imagen.informacionBase.ProfundidadColor / 8);
            int anchoEnBytes = bmp.Width * bytesPorPixel;
            int paddedBytes = ((anchoEnBytes + 3) & ~3) - anchoEnBytes;
            int anchoBytesPadd = anchoEnBytes + paddedBytes;
            byte[] bmpArr = new byte[bmp.Height * anchoBytesPadd];

            Type t = typeof(T);
            int j = 0;

            System.Runtime.InteropServices.Marshal.Copy(pbmp, bmpArr, 0, bmp.Height * anchoBytesPadd);
            bmp.UnlockBits(bmpd);

            switch (t.Name)
            {
                case "Color8":
                    colorArray8 = Array.ConvertAll<BaseColor, Color8>(objectArray, delegate(BaseColor b) { return b as Color8; });
                    for (int i = 0; i < bmpArr.Length; i += bytesPorPixel)
                    {
                        colorArray8[j] = new Color8();
                        colorArray8[j++].FromBMPColorArray(bmpArr, i);
                        if (j % bmp.Width == 0)
                            i += paddedBytes;
                    }
                    return colorArray8 as T[];
                case "Color16":
                    colorArray16 = Array.ConvertAll<BaseColor, Color16>(objectArray, delegate(BaseColor b) { return b as Color16; });
                    for (int i = 0; i < bmpArr.Length; i += bytesPorPixel)
                    {
                        colorArray16[j] = new Color16();
                        colorArray16[j++].FromBMPColorArray(bmpArr, i);
                        if (j % bmp.Width == 0)
                            i += paddedBytes;
                    }
                    return colorArray16 as T[];
                case "Color24":
                    colorArray24 = Array.ConvertAll<BaseColor, Color24>(objectArray, delegate(BaseColor b) { return b as Color24; });
                    for (int i = 0; i < bmpArr.Length; i += bytesPorPixel)
                    {
                        colorArray24[j] = new Color24();
                        colorArray24[j++].FromBMPColorArray(bmpArr, i);
                        if (j % bmp.Width == 0)
                            i += paddedBytes;
                    }
                    return colorArray24 as T[];
                case "Color32":
                    colorArray32 = Array.ConvertAll<BaseColor, Color32>(objectArray, delegate(BaseColor b) { return b as Color32; });
                    for (int i = 0; i < bmpArr.Length; i += bytesPorPixel)
                    {
                        colorArray32[j] = new Color32();
                        colorArray32[j++].FromBMPColorArray(bmpArr, i);
                        if (j % bmp.Width == 0)
                            i += paddedBytes;
                    }
                    return colorArray32 as T[];
                default:
                    colorArray = Array.ConvertAll<BaseColor, T>(objectArray, delegate(BaseColor b) { return b as T; });
                    for (int i = 0; i < bmpArr.Length; i += bytesPorPixel)
                    {
                        colorArray[j] = new T();
                        colorArray[j++].FromBMPColorArray(bmpArr, i);
                        if (j % bmp.Width == 0)
                            i += paddedBytes;
                    }

                    return colorArray;
            }
        }<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
[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: Performance
« Respuesta #19 en: Miércoles 18 de Octubre de 2006, 00:01 »
0
:lol:

Bie gracias a la ayuda e una persona del foro de Microsoft he llegado a esta solucion, por cierto muy sencilla e ingeniosa, asi obtuve los mismo tiempos que en mi implementacion anterior cambiando una sola linea de la implenentacion original, y bueno adicionando un metodo extra a las clases derivadas de BaseColor

Cree este metodo en la clase base

Código: Text
  1. public abstract BaseColor CreateNew();
  2.  

y en cada una de las clases que heredan de ella desde luego hubo que implementarlo ej:

Código: Text
  1. class Color8
  2. {
  3.    ...
  4.    ...
  5.    public override BaseColor CreateNew()
  6.    {
  7.       return new Color8();
  8.    }
  9. }
  10.  


Y finalmente el metodo quedo asi:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
        /// <summary>Extrae de un BMP sus colores en forma de un array de color compatible de imagen JKI</summary>
        /// <param name="bmp">Mapa de bits del cual se estraeran los colores</param>
        /// <returns>Array de colores extraidos del Bitmap</returns>
        public T[] ColorArrayDesdeBMP(Bitmap bmp)
        {
            T[] colorArray = new T[bmp.Height * bmp.Width];
            BitmapData bmpd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
            IntPtr pbmp = bmpd.Scan0;
            byte bytesPorPixel = 0;
            int j = 0;
            T factory = new T();

            bytesPorPixel = (byte)((int)imagen.informacionBase.ProfundidadColor / 8);
            int anchoEnBytes = bmp.Width * bytesPorPixel;
            int paddedBytes = ((anchoEnBytes + 3) & ~3) - anchoEnBytes;
            int anchoBytesPadd = anchoEnBytes + paddedBytes;
            byte[] bmpArr = new byte[bmp.Height * anchoBytesPadd];
            System.Runtime.InteropServices.Marshal.Copy(pbmp, bmpArr, 0, bmp.Height * anchoBytesPadd);
            bmp.UnlockBits(bmpd);
            for (int i = 0; i < bmpArr.Length; i += bytesPorPixel)
            {
                colorArray[j] = (T)factory.CreateNew();

                colorArray[j++].FromBMPColorArray(bmpArr, i);
                if (j % bmp.Width == 0)
                    i += paddedBytes;
            }
            return colorArray;
        }<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

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