【问题标题】:Does it matter performance wise if there is an `else` after the first `return`?如果在第一个“return”之后有一个“else”,这对性能有影响吗?
【发布时间】:2012-12-15 16:37:53
【问题描述】:

我现在已经看到了两种不同的方法来创建一个布尔返回方法:

bool Case1()
{
    if (A)
        return true;
    else
        return false;
}
bool Case2()
{
    if (A)
        return true;
    return false;
}

哪个更快?不写else 只是为了节省一行,让它更清晰,或者性能提升可以忽略不计,是否有意义?

【问题讨论】:

  • “……对于微不足道的性能提升有意义吗?” - 不!做有意义的事,而不是让你的 CPU 执行快一纳秒。
  • @RichardJ.RossIII 因为我什至不知道我是否可以节省一些执行时间,所以我觉得应该问这些问题。此外,我可能每秒使用它们几千次,所以它可能会有所作为。
  • @RichardJ.RossIII - 我不同意。性能很重要,虽然这可能不重要,但草率的想法确实如此。程序员很容易停止思考这些问题,因为它们“太小”并且很快就会拥有一个永远不会完成的系统或程序。我一次又一次地看到它。
  • 您已经以两种方式编写了代码。如果您想知道哪个更快双向运行,然后您就会知道ericlippert.com/2012/12/17/performance-rant
  • @user1306322:正是我的观点。如果差异是如此之小以至于您无法注意到它,那么请停止担心它,并将您的宝贵时间花在对世界产生显着影响的事情上。

标签: c# .net performance if-statement return


【解决方案1】:

c# 编译器应该为这两种情况生成相同的 IL,因此性能上应该没有差异。如果您对实际发生的事情感到好奇(尝试教如何钓鱼),您可以随时 view the generated IL

恕我直言,Case1 更容易阅读,这是值得的。我的第二个选择是return A;(如其他一些答案中所述)。如果A 不是bool,则存在隐式转换,在某些情况下可能会造成混淆。

我认为可读性应该胜出,除非你可以证明使用分析器你有问题。

【讨论】:

  • "c# 编译器将生成相同的 MSIL" -- 已验证?
  • 不,未验证。但我很想知道为什么没有。
  • 太糟糕了,我不能多次投票。案例1更清晰。编程语言是为人类编写的,而不是编译器,所以所有事情(包括性能)都是平等的,从可读性的角度来看,选择最清晰的。
【解决方案2】:

它们是一样的。

如果A 为假,两种情况下都会跳转到return false 语句。

【讨论】:

  • 我不知道谁对此投了反对票,但我们将不胜感激。
【解决方案3】:

在性能方面它们是相同的。从良好的编码实践的角度来看,更喜欢后者 - 以便清楚函数始终返回有效值。

【讨论】:

    【解决方案4】:

    不会有(可以忽略不计的)差异。从编码的角度来看,你真的应该这样做:

    return A;
    

    但假设代码只是一个示例,那么我建议:

    bool Case3()
    {
        bool retValue;
        if (A)
        {
            retValue = true;
        } 
        else
        { 
            retValue = false;
        }
        return retValue;
    }
    

    这样你就很清楚正在发生什么,以及要返回什么值。如果您需要返回并更改该方法的功能,那会容易得多。

    【讨论】:

    • 是的。布尔表达式必须位于 if 语句或循环语句中是一个非常普遍的想法,但布尔表达式与任何其他表达式一样。没有人会这样编码:if (x==1) return 1; else if(x==2) return 2; else if (x==3) return 3; ...。为什么要使用布尔值?
    • 那你就不能return A ? true : false;吗?
    【解决方案5】:

    没有。

    即使我们查看他们的IL 代码,它们也具有相同的IL 代码,因此它们之间没有性能差异。 使用更易读的那个

    .method private hidebysig instance bool  Case1() cil managed
    {
      // Code size       9 (0x9)
      .maxstack  1
      .locals init ([0] bool CS$1$0000,
               [1] bool CS$4$0001)
      IL_0000:  nop
      IL_0001:  ldc.i4.0
      IL_0002:  stloc.1
      IL_0003:  ldc.i4.1
      IL_0004:  stloc.0
      IL_0005:  br.s       IL_0007
      IL_0007:  ldloc.0
      IL_0008:  ret
    } // end of method Program::Case1
    

    看看这些代码的表现;

    http://ideone.com/8Sc7Ho --> 内存:33856 kB

    http://ideone.com/MrnaAl --> 内存:33808 kB

    因此,即使您使用它们 10.000 次,也无需担心。

    【讨论】:

    • 此处的控制台输出工作将使您尝试测试的问题黯然失色。
    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 2014-01-05
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多