У меня есть некоторый код обработки изображений, который проходит через 2 многомерных массива байтов (того же размера). Он берет значение из исходного массива, выполняет для него вычисления, а затем сохраняет результат в другом массиве.
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));
}
}
Цикл в настоящее время занимает ~ 11 мс, что, как я полагаю, связано в основном с доступом к значениям байтовых массивов, так как вычисления довольно просты (2 умножения и 1 сложение).
Что я могу сделать, чтобы ускорить это? Это критичная ко времени часть моей программы, и этот код вызывается 80-100 раз в секунду, поэтому любое увеличение скорости, даже небольшое, будет иметь значение. Также в данный момент xSize = 768 и ySize = 576, но в будущем это увеличится.
Обновление : Благодаря Гуффа (см. Ответ ниже), следующий код экономит мне 4-5 мс на цикл. Хотя это небезопасный код.
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--;
}
}
}