我有一些图像处理代码,它循环遍历两个多维字节数组(大小相同)。它从源数组中取出一个值,对其进行计算,然后将结果存储在另一个数组中。
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,但这将来会增加。
更新:感谢Guffa(请参见下面的答案),以下代码每个循环节省了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--;
}
}
}