阈值计算的优化

时间:2012-06-08 09:12:19

标签: c# optimization ternary-operator threshold

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

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

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

我认为问题与三元条件运算符有关,因为它会导致分支。我认为某种类型的纯数学运算可以明显更快,因为它对CPU缓存友好。

有没有办法优化这个?如果有帮助,我可以修正阈值。我认为任何超过7%的性能提升都会带来胜利,因为整个处理时间缩短了整整10分钟。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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);

答案 2 :(得分: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,看看它是否更快