gpt4 book ai didi

c# - 读取字节数组与 int 数组和位移 - 哪个更快?

转载 作者:行者123 更新时间:2023-11-30 21:13:26 25 4
gpt4 key购买 nike

其中之一明显更快吗?

var scan0 = (uint*)bitmapData.Scan0;
int length = pixels.Length;
for (int i = 0; i < length; i++)
{
uint j = scan0[i];
float a = (j >> 24) / 255f;
pixels[i] = new Vector(
(j >> 16 & 0xff) * a / 255,
(j >> 8 & 0xff) * a / 255,
(j & 0xff) * a / 255);
}

对比

var scan0 = (byte*)bitmapData.Scan0;
int length = pixels.Length * 4;
for (int i = 0; i < length; i += 4)
{
float a = scan0[i + 3] / 255f;
pixels[i / 4] = new Vector(
scan0[i + 2] * a / 255,
scan0[i + 1] * a / 255,
scan0[i] * a / 255);
}

最佳答案

在 32 位应用程序中,第二个比第一个快 2.5 倍。在 64 位应用程序中,第二个比第一个快大约 25%。

请注意,您的第二个代码中存在错误。当您在每次迭代中添加四个时,您会将对象放入 pixels 数组中的每第四个项目中,并在数组用完时引发 IndexOutOfRangeException 异常。

比第二个稍微快一点(大约 5%)是为每个像素移动指针:

byte* scan0 = (byte*)bitmapData.Scan0;
for (int i = 0; i < pixels.Length; i++) {
float a = scan0[3] / 255f;
pixels[i] = new Vector(
scan0[2] * a / 255,
scan0[1] * a / 255,
scan0[0] * a / 255
);
scan0 += 4;
}

另请注意,如果您从 Bitmap 图像读取数据,它不会存储为连续的像素数据数组。扫描线之间可能有填充,因此代码只能从单个扫描线读取像素,不能安全地从整个图像读取数据。

编辑:

此外,我刚刚意识到您将数组的长度放在一个变量中并在循环中使用它。这只会让代码变慢而不是变快,因为编译器无法优化数组访问的范围检查。

关于c# - 读取字节数组与 int 数组和位移 - 哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6856649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com