【问题标题】:if->return vs. if->else efficiencyif->return vs. if->else 效率
【发布时间】:2012-03-05 06:36:27
【问题描述】:

这听起来像是一个愚蠢的问题,我犹豫是否要发布它,但仍然: 如果某些东西只需要在特定条件下运行,那么哪种更有效:

答。

if (condition) {
   // do
   // things...
}

B.

if (!condition) { return; }
// do
// things...

【问题讨论】:

  • 你测量过这个吗?你发现了什么?
  • 这是一种风格。性能不相关;两者都产生几乎相同的机器代码。如果您想避免“水平编程”,您可能希望 B 避免嵌套条件。
  • 如果您有此类问题,请查看jsperf.com。非常有用的网站!
  • 你说的是哪种语言和框架? (这并不重要,因为所有语言和框架的答案都是一样的)。
  • 另外,我当然理解这如何被视为一个“不必要的”(或者用最坏的说法是“愚蠢的noobish”)问题,并期望(并得到)至少一个“严厉的回应”关于它,但出于真正的兴趣和渴望听到更多专家对此的看法(并且也得到了这些,所以谢谢)。

标签: performance return if-statement


【解决方案1】:

它们同样有效,但 B 通常被认为具有更好的可读性,尤其是在用于消除多个嵌套条件时。

【讨论】:

    【解决方案2】:

    请选择最易读的内容。此级别的性能优化几乎不是问题。即使是对性能非常敏感的框架(例如 .NET 框架)也无法从这种微优化中受益。

    【讨论】:

      【解决方案3】:

      这是一种风格。性能不相关;两者都产生几乎相同的机器代码。

      关于样式的一些注意事项:

      如果您想避免“水平编程”,您可能希望使用 B 来避免嵌套条件。例如,如果你想在不过多影响方法流程的情况下添加异常:

      A:

      public String getDescription(MyObject obj) {
          if (obj == null) {
              return "";
          } else {
              if (!obj.isValid()) {
                  return "invalid";
              } else {
                  ...
              }
          }
       }
      

      B:

      public String getDescription(MyObject obj) {
          if (obj == null) {
              return "";
          }
      
          if (!obj.isValid()) {
              return "invalid";
          }
      
          ....
       }
      

      但如果你问我,差异很小。绝对不值得“代码风格大战”。

      【讨论】:

        【解决方案4】:

        真正的问题是,你真的应该关心吗?

        我说不!拥有更好的可读性代码比进行一些微优化更重要。

        【讨论】:

          【解决方案5】:

          虽然我同意您应该首先选择可读性,但我将继续添加一些信息:在 C# 中,没有区别。它编译成相同的东西(通过构建发布模式进行优化时)。其他语言?谁知道呢,我敢肯定他们中的一些人认为它不同,但你真正需要关注它的可能性微乎其微。

          【讨论】:

            【解决方案6】:

            两种情况下的性能大致相同。因此,它更像是一个风格或偏好问题。

            我个人更喜欢写 if--> return 即 case B,因为如果代码包含复杂的嵌套条件,它会使代码看起来更干净,更易于阅读。

            【讨论】:

              猜你喜欢
              • 2012-02-29
              • 1970-01-01
              • 2017-02-05
              • 2015-10-28
              • 2015-10-20
              • 1970-01-01
              • 1970-01-01
              • 2012-01-10
              • 1970-01-01
              相关资源
              最近更新 更多