En mi aplicación, estoy almacenando Bitmap
datos en una matriz de enteros bidimensional (int[,]
). Para acceder a los valores de R, G y B que utilizo algo como esto:matriz de enteros o matriz de estructuras: ¿cuál es mejor?
// read:
int i = _data[x, y];
byte B = (byte)(i >> 0);
byte G = (byte)(i >> 8);
byte R = (byte)(i >> 16);
// write:
_data[x, y] = BitConverter.ToInt32(new byte[] { B, G, R, 0 }, 0);
estoy usando matrices de enteros en lugar de un verdadero System.Drawing.Bitmap
porque mi aplicación se ejecuta en dispositivos Windows Mobile, donde la memoria disponible para la creación de mapas de bits está severamente limitado.
Me pregunto, sin embargo, si tendría más sentido para declarar una estructura como esta:
public struct RGB
{
public byte R;
public byte G;
public byte B;
}
... y luego usar una gran variedad de RGB
lugar de una matriz de int
. De esta forma, podría leer y escribir fácilmente los valores separados R, G y B sin tener que hacer cambios de bit y BitConverter. Recuerdo vagamente algo de días anteriores que las variables byte
estaban alineadas en bloques en sistemas de 32 bits, por lo que un byte
realmente ocupa 4 bytes de memoria en lugar de solo 1 (pero tal vez esto era solo algo de Visual Basic).
¿Usaría una matriz de estructuras (como el ejemplo anterior RGB
) sería más rápido que usar una matriz de entradas, y usaría 3/4 de la memoria o 3 veces la memoria de las entradas?
OK, el regreso de la unión. No sabía .NET permitió la superposición de campos. –
Gracias por la información: no me di cuenta de que hay una diferencia IL en obtener un int de una matriz en lugar de una estructura, lo que explica por qué la lectura puede ser más rápida desde una matriz int. ¿Conoces alguna forma de escribir en la matriz int sin usar BitConverter.ToInt32? – MusiGenesis
Además, definitivamente voy con el rendimiento sobre la legibilidad aquí. Mi aplicación tiene que procesar y combinar grandes cantidades de estos mapas de bits, por lo que cualquier mejora en la velocidad de lectura/escritura reduce significativamente el tiempo total empleado. – MusiGenesis