tun*_*nuz 7 c# int performance bit-manipulation
几个星期前我开始使用C#,现在我需要建立一个"位设置"标志来处理算法中的不同情况.我有两个选择:
enum RelativePositioning
{
LEFT = 0,
RIGHT = 1,
BOTTOM = 2,
TOP = 3,
FRONT = 4,
BACK = 5
}
pos = ((eye.X < minCorner.X ? 1 : 0) << (int) RelativePositioning.LEFT)
+ ((eye.X > maxCorner.X ? 1 : 0) << (int) RelativePositioning.RIGHT)
+ ((eye.Y < minCorner.Y ? 1 : 0) << (int) RelativePositioning.BOTTOM)
+ ((eye.Y > maxCorner.Y ? 1 : 0) << (int) RelativePositioning.TOP)
+ ((eye.Z < minCorner.Z ? 1 : 0) << (int) RelativePositioning.FRONT)
+ ((eye.Z > maxCorner.Z ? 1 : 0) << (int) RelativePositioning.BACK);
Run Code Online (Sandbox Code Playgroud)
要么:
enum RelativePositioning
{
LEFT = 1,
RIGHT = 2,
BOTTOM = 4,
TOP = 8,
FRONT = 16,
BACK = 32
}
if (eye.X < minCorner.X) { pos += (int) RelativePositioning.LEFT; }
if (eye.X > maxCorner.X) { pos += (int) RelativePositioning.RIGHT; }
if (eye.Y < minCorner.Y) { pos += (int) RelativePositioning.BOTTOM; }
if (eye.Y > maxCorner.Y) { pos += (int) RelativePositioning.TOP; }
if (eye.Z > maxCorner.Z) { pos += (int) RelativePositioning.FRONT; }
if (eye.Z < minCorner.Z) { pos += (int) RelativePositioning.BACK; }
Run Code Online (Sandbox Code Playgroud)
我可以使用某些东西,((eye.X > maxCorner.X) << 1)但C#不允许从bool到int的隐式转换,并且三元运算符足够相似.我现在的问题是:在第二个版本中使用第一个版本是否有任何性能提升?
谢谢
Tommaso
你绝对应该为你的枚举使用Flags属性.那样它看起来像那样:
[Flags]
public enum RelativePositionings
{
None = 0,
Left = 1,
Right = 2,
Bottom = 4,
Top = 8,
Front = 16,
Back = 32
}
Run Code Online (Sandbox Code Playgroud)
有了这个,你可以这样做:
var position = RelativePositionings.Left | RelativePositionings.Front;
Run Code Online (Sandbox Code Playgroud)
并通过以下方式检查每个州:
if(position.HasFlag(RelativePositioning.Left))
{
//To do: if left bit is set?
}
Run Code Online (Sandbox Code Playgroud)
内联运if算符(?,:)将生成if与第二个示例中的标准列表几乎相同的IL .您将在这里看到的唯一区别是处理器将要执行的特定操作,我敢打赌它ADD比这更快SHL.
既然你还是要添加结果,我会选择第二个例子(加上它会让它更容易阅读).
编辑
我刚检查了两个例子的IL,这与我上面所说的相反.
第一个示例生成的IL少得多(少34行),因此您必须运行性能测试才能确定它是否更快.
| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |