我有一些图像处理代码,循环遍历 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,但将来会增加。
Update: 谢谢Guffa https://stackoverflow.com/users/69083/guffa(参见下面的答案),下面的代码每个循环节省了 4-5 毫秒。虽然它是unsafe code.
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--;
}
}
}
要获得此代码的真正加速,您需要使用指针来访问数组,从而消除所有索引计算和边界检查。
int size = ResultImageData.Length;
unsafe
{
fixed(byte* rp = ResultImageData, cp = CurrentImageData, ap = AlphaImageData)
{
byte* r = rp;
byte* c = cp;
byte* a = ap;
while (size > 0)
{
*r = (byte)(*c * AlphaValue + *a * OneMinusAlphaValue);
r++;
c++;
a++;
size--;
}
}
}
Edit:
固定变量无法更改,因此我添加了代码以将指针复制到可以更改的新指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)