¿Se puede optimizar este código?
Tengo un código de procesamiento de imágenes que recorre 2 conjuntos de bytes multidimensionales (del mismo tamaño). Toma un valor de la matriz fuente, realiza un cálculo y luego almacena el resultado en otra matriz.
int xSize = ResultImageData.GetLength(0);
int ySize = ResultImageData.GetLength(1);
for (int x = 0; x < xSize; x++)
{
for (int y = 0; y < ySize; y++)
{
ResultImageData[x, y] = (byte)((CurrentImageData[x, y] * AlphaValue) +
(AlphaImageData[x, y] * OneMinusAlphaValue));
}
}
El ciclo actualmente toma ~ 11 ms, lo que supongo se debe principalmente al acceso a los valores de los conjuntos de bytes, ya que el cálculo es bastante simple (2 multiplicaciones y 1 suma).
¿Hay algo que pueda hacer para acelerar esto? Es una parte crítica del tiempo de mi programa y este código se llama 80-100 veces por segundo, por lo que cualquier ganancia de velocidad, por pequeña que sea, hará la diferencia. También en este momento xSize = 768 y ySize = 576, pero esto aumentará en el futuro.
Actualiza: Gracias a Guffa (vea la respuesta a continuación), el siguiente código me ahorra de 4 a 5 ms por ciclo. Aunque esinsegur código.
int size = ResultImageData.Length;
int counter = 0;
unsafe
{
fixed (byte* r = ResultImageData, c = CurrentImageData, a = AlphaImageData)
{
while (size > 0)
{
*(r + counter) = (byte)(*(c + counter) * AlphaValue +
*(a + counter) * OneMinusAlphaValue);
counter++;
size--;
}
}
}