我正在尝试优化以下C#代码,根据阈值将字节设置为0x00
或0xFF
。
for (int i = 0; i < veryLargeNumber; i++)
{
data[i] = (byte)(data[i] < threshold ? 0 : 255);
}
Visual Studio的性能分析器显示上述代码相当昂贵,计算时间近8秒 - 占总处理费用的98%。我处理的物品不到一千件,所以加起来超过两个小时。
我认为问题与三元条件运算符有关,因为它会导致分支。我认为某种类型的纯数学运算可以明显更快,因为它对CPU缓存友好。
有没有办法优化这个?如果有帮助,我可以修正阈值。我认为任何超过7%的性能提升都会带来胜利,因为整个处理时间缩短了整整10分钟。
答案 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,看看它是否更快