2

我正在尝试优化以下 C# 代码,它将字节设置为0x000xFF基于阈值。

for (int i = 0; i < veryLargeNumber; i++)
{
    data[i] = (byte)(data[i] < threshold ? 0 : 255);
}

Visual Studio 的性能分析器显示,上述代码相当昂贵,需要将近 8 秒的时间来计算 - 占我总处理费用的 98%。我正在处理不到一千件物品,因此加起来超过两个小时。

我认为问题与三元条件运算符有关,因为它会导致分支。我想某种纯数学运算可能会快得多,因为它对 CPU 缓存友好。

有没有办法优化这个?如果有帮助,我可以修复阈值。我认为任何高于约 7% 的性能提升都是胜利,因为总处理时间缩短了整整 10 分钟。

4

3 回答 3

3

如果您使用的是 .NET 4.0 Framework,您可以在以下链接中使用并行库,

http://msdn.microsoft.com/en-us/library/dd460717

在您的情况下,您必须验证阈值,无论如何这需要时间。所以使用线程或 lambda 表达式

于 2012-06-08T09:15:48.330 回答
1

只是建议,为此目的使用按位运算符,因为它们更快,以及并行方法。

0x00 = 0000 0000 
0xFF = 1111 1111

尝试使用OR运算符(即0 | 1 = 1代表|运算OR符的位置

编辑:

这就是你可以比较哪个数字更大的方法:让a,b数字:

int temp= a ^ b;
temp|= temp>> 1;
temp|= temp>> 2;
temp|= temp>> 4;
temp|= temp>> 8;
temp|= temp>> 16;

temp&= ~(temp>> 1) | 0x80000000;
temp&= (a ^ 0x80000000) & (b ^ 0x7fffffff);
于 2012-06-08T09:19:52.163 回答
0

如果您想要一个位解决方案 -

int intSize = sizeof(int) * 8 - 1;
byte t = (byte)(threshold - 1);
for (....)
{
    data[i] = (byte)(255 + 1 ^ ((t - data[i]) >> intSize));
}  

注意:不适用于 0 的极端情况。抱歉

另外,尝试使用 int 数组而不是 byte 看看它是否更快

于 2012-06-08T10:10:40.247 回答