Tengo un código de procesamiento de imágenes que recorre 2 matrices de bytes multidimensionales (del mismo tamaño). Toma un valor de la matriz fuente, realiza un cálculo en ella y luego almacena el resultado en otra matriz.¿Se puede optimizar este código?
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 bucle actualmente toma ~ 11 ms, que supongo se debe principalmente a acceder a los valores de las matrices de bytes como el cálculo es bastante simple (2 multiplicaciones y 1 Además).
¿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, aunque pequeña, hará la diferencia. También en el momento xSize = 768 y ySize = 576, pero esto aumentará en el futuro.
Actualización: Gracias a Guffa (ver respuesta a continuación), el siguiente código me ahorra 4-5ms por ciclo. Aunque es inseguro 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--;
}
}
}
@Andrew Arnott: Aunque es completamente correcto, también completamente inútil. ;) – Guffa
¿Se puede actualizar con el tiempo para el código en la respuesta aceptada? Sería interesante saber cuánta diferencia hace guardar las 3 adiciones de contador por iteración de bucle. –
Si miras la sección "ACTUALIZAR" de mi pregunta, está allí. El código basado en la respuesta aceptada tarda 6-7 ms por ciclo, en comparación con ~ 11 ms para el código original. ¿Esto ayuda o estás preguntando sobre alguna otra versión del código? –