【问题标题】:Nested if-statements vs alternative code structure (performance implications?)嵌套 if 语句与替代代码结构(性能影响?)
【发布时间】:2013-07-26 06:04:42
【问题描述】:

我经常这样构建我的代码:

public void doSomething() {
    if (!condition1) {
        println("problem 1");
        return;
    }
    if (!condition2) {
        println("problem 2");
        return;
    }
    if (!condition3) {
        println("problem 3");
        return;
    }

    // code to run if
    // everything is OK
}

而不是像这样嵌套:

public void doSomething() {
    if (condition1) {
        if (condition2) {
            if (condition3) {
                // code to run if
                // everything is OK
            }
            else {
                println("problem 3");
            }   
        }
        else {
            println("problem 2");
        }
    }
    else {
        println("problem 1");
    }

}

两者相比有什么好处吗?一个比另一个更“正确”吗?谢谢!

【问题讨论】:

  • public void doSomething() { if (condition1 && condition2 && condition3) { // 运行代码 if // 一切正常 } else if(!condition1) { println("problem 1"); } else if (!conditoin2) { println("问题 2"); } else { println("问题 3"); } }
  • 更改分支结构不会导致性能提升 IMO。与这种微优化相比,更关注可读性。在您的代码中搜索一些主要的优化机会。
  • @Juvanis,这两个示例将产生完全相同的输出。你在说什么?
  • @Veera,这将导致条件被多次评估。我正在处理适度昂贵的条件操作,所以这将是一个坏主意。如果 condition1 为真,我只想评估 condition2。
  • @Juvanis 请在此处查看此代码产生相同输出的证据:ideone.com/LGTgP3

标签: java performance if-statement conditional nested


【解决方案1】:

您应该分析您的代码,看看大多数情况下哪个条件为真。如果每个条件为真的次数存在显着差异,那么一定要使用第一个结构,安排您的代码以利用您特定于域的输入。这可能会为您带来一些显着的性能优势。

【讨论】:

    【解决方案2】:

    任何一种代码结构都可以,但有多个return 语句会在调试时增加另一层复杂性,并且在键入和/或编辑代码时更容易出错。

    【讨论】:

      【解决方案3】:
      if(condition1){
      
      } else if(condition2){
      
      } else if(condition3){
      
      } else {
      
      }
      

      或使用 switch 语句。这里没有显着的性能优势。使用在您的情况下更易读/更适合的一种。我应该补充的另一件事是,在某些情况下 switch 语句比 if..else 更快,否则您将检查不同的子句,直到它达到一个匹配项或根本没有匹配项。

      【讨论】:

      • 这也可以,但有时我想在 if 语句之前做一些事情(比如声明一个变量),所以我使用多个 ifs 和 returns 而不是 @987654325 @.
      • 以下是我认为我应该这样做的一个例子:pastebin.com/22hx0NrR 请告知。
      • @BLuFeNiX 在我看来有点分散。在一个方法中使用多个返回/退出是可以的,但它可能是滥用的,需要额外注意......想象一下你忘记将 return 语句放在代码中的一个 if 中,然后它会打印出“一切正常!”如果不是。
      • 是的,我知道它更容易出现拼写错误,但我认为当我有 10 个条件要满足时,代码更容易阅读,每个条件都需要自己的设置才能运行条件.也许我会开设一个ConditionEvaluator 课程,以便两全其美。
      • @BLuFeNiX 不要为此创建另一个类..为了减少评估,您可以使用 if..return 或 if..else if..etc。无论哪种方式都应该没问题。
      【解决方案4】:

      每当我看到多个 if 时,我都会考虑使用 switch 语句,以提高可读性..并避免多个重复 ....if 词....

      【讨论】:

      • 它是因为满足条件的代码可能会运行到100s代码,并且很难跟踪开始和结束的大括号......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多