C# 执行三元运算符或将枚举强制转换为浮点,哪个更快?

C# 执行三元运算符或将枚举强制转换为浮点,哪个更快?,c#,performance,C#,Performance,我有一个名为facing的枚举 public enum Facing { Right = 0, Left = 1 } 我有一个对象的位置,使0度的旋转是右,180度是左。为了确保它面向正确的方向,我可以做以下两件事之一: this.rotation(this.facing == Facing.Left ? 180f : 0f); 或者,我可以厚着脸皮做这样的事情: this.rotation((float)this.facing * 180f); 有一些事情需要考虑,比如分

我有一个名为facing的枚举

public enum Facing
{
    Right = 0,
    Left = 1
}
我有一个对象的位置,使0度的旋转是右,180度是左。为了确保它面向正确的方向,我可以做以下两件事之一:

this.rotation(this.facing == Facing.Left ? 180f : 0f);
或者,我可以厚着脸皮做这样的事情:

this.rotation((float)this.facing * 180f);
有一些事情需要考虑,比如分支预测,我想,它会朝着三元更快的方向倾斜。但总的来说,哪一种可能更快


另外,我知道与枚举的比较更具可读性,而且很可能是我将采用的任何一种方法。这更能满足我的好奇心。

我按照建议自己骑马

  • 我生成了100000000个随机“面”的列表
  • 我针对这两种方法运行列表
    • 这两种方法的顺序是随机选择的
    • 我记录每个结果
  • 我重复这个过程10次
  • 我取平均数
通过以上的多次运行。。。两者似乎花费的时间几乎相同。每批100000000大约280毫秒

一个非常令人扫兴的结果

编辑:有趣的是,第一批演员似乎总是要花更多的时间,大约100毫秒。但随后的批次通常会使铸件运行得更快,使平均值更均匀


另外,我想知道的另一件事是“为什么一个比另一个快”,但既然两者都是一样的,我不知道还有什么好考虑。

我想我的另一半问题是“为什么”一个比另一个快。转换为
int
。我从未听说过将枚举强制转换为
float
,因为它们只能由整数类型表示。我认为演员阵容会失败。Fastest将依赖于基准测试。一个版本有一个分支,另一个没有,如果你运行这个代码一百万次,这可能会很重要,但我敢打赌抖动足够聪明,可以将两个版本优化为大致相同的东西。我认为有两种方法可以知道哪一个运行得更快:1)你可以多次比较两行代码,并测量性能;第二种方法是查看CIL代码,检查这两种代码产生的行数,并比较谁产生的行数最多,以找出谁的性能更昂贵。处理器有条件移动指令以避免分支,x86/x64上的CMOV。但是这段代码生成一个浮点值,没有cmov,所以您得到了分支。如果分支预测无效,则有可能乘法更快。通常情况下,你只能用真实的数据来分析它。@Marlonchosky CIL代码并不是很重要。更重要的是抖动的作用,因为我见过抖动将一组十几条IL语句减少为一个或两个CPU操作码的情况。@ckuri你确定吗?