通过在C#中使用按位运算符而不是普通的int和,可以显着提高性能?

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

Oli*_*ver 8

你绝对应该为你的枚举使用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)


Cod*_*uth 5

内联运if算符(?,:)将生成if与第二个示例中的标准列表几乎相同的IL .您将在这里看到的唯一区别是处理器将要执行的特定操作,我敢打赌它ADD比这更快SHL.
既然你还是要添加结果,我会选择第二个例子(加上它会让它更容易阅读).

编辑
我刚检查了两个例子的IL,这与我上面所说的相反.
第一个示例生成的IL少得多(少34行),因此您必须运行性能测试才能确定它是否更快.