【问题标题】:Does the priority of an or-statement matter?or-语句的优先级重要吗?
【发布时间】:2018-06-13 22:52:49
【问题描述】:

假设我有这段代码:

age = 21;
allowedFromParents = false;
if (age >= 18 || allowedFromParents == true)
{
    //go drink
}

当我调试这部分代码时,当它检查第一部分并且这是真的时,它已经进入语句内部,而无需检查其他语句。

现在,这只是一个简单的条件,但如果条件语句的计算量要大得多,并且在频繁循环中并且其中一个比另一个更有可能返回 true,该怎么办。
那么条件的顺序对性能有影响吗?

【问题讨论】:

  • 您是为了知识而问这个问题,还是您在 OR 评估中的条件顺序确实存在性能问题?很明显,如果第一个条件比后者更频繁地返回 true,那么您将获得更好的性能,但这更多地取决于您在这些条件评估中所做的工作
  • @Steve 主要是为了知识。我几乎可以肯定它会影响性能,但我很好奇是否有更好的解释来解释我的想法。
  • 最近我发现,除了性能之外,您还可以为许多其他用途更改语句优先级,它还可以用于缩短单个 if 语句。例如,也可以在单个语句中检查一个类是否不为空,然后立即检查该类中的值。在学习的过程中能更多地理解代码的逻辑是很好的。

标签: c# conditional-statements


【解决方案1】:

您所看到的称为短路评估。

如您所料,条件语句的顺序可能会影响性能:如果其中一个语句的计算量很多繁重,并且在紧密循环中完成,您可以考虑将另一个首先。

然而,

过早的优化是万恶之源——DonaldKnuth

这意味着除非您在此代码中测量性能瓶颈,否则您应该在编写它时考虑到可读性,而不是性能。

【讨论】:

    【解决方案2】:

    是的,这很重要。如果第一个条件为真,那么它将停止评估其余条件。换句话说,右边的条件可能不会被评估。

    逻辑或运算符 (||) 返回布尔值 true 或者两个操作数都为真,否则返回假。操作数是 在评估之前隐式转换为 bool 类型,结果 是布尔类型。逻辑 OR 具有从左到右的结合性。

    https://msdn.microsoft.com/fi-fi/library/f355wky8(v=vs.120).aspx

    【讨论】:

      【解决方案3】:

      将需要更多时间执行的条件放在右侧,因此如果左侧的条件评估为真,则不会检查第二个条件。

      是的,如果您处于一个会迭代的紧密循环中,那么在最坏的情况下可以说一千次,那么它肯定会提高性能

      【讨论】:

        【解决方案4】:

        是的,这些语句的优先级很重要,但不仅仅是性能。
        在某些情况下,它可用于缩短多个 if 语句。

        例如:

        if (patient == null || patient.age == 0)
        {
            //patient is invalid
        }
        

        我以前认为这只适用于 and 语句,但在这种情况下,除非患者不为空,否则它不会到达第二个语句。使其在可读性、性能方面更高效,在我的情况下,更安全地防止崩溃。

        【讨论】:

          猜你喜欢
          • 2013-03-30
          • 1970-01-01
          • 2013-05-16
          • 2012-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-04
          • 2018-02-22
          相关资源
          最近更新 更多