【问题标题】:Short Circuiting vs Multiple if's短路与多重 if's
【发布时间】:2015-09-19 07:37:54
【问题描述】:

这有什么区别:

if(a && b)
{
     //code
}

还有这个:

if(a)
{
     if(b)
     {
          //code
     }
}

据我所知,b 只有在 a 为真时才会在第一个代码块中进行评估,而第二个代码块也是一样的。

使用其中一个有什么好处吗?代码执行时间?记忆?等等

【问题讨论】:

  • 为什么要关心执行时间或内存?这太疯狂了。这是一个明显的例子,其中一个可能比另一个更清晰、更容易理解。你为什么还要考虑微优化?!在没有证明需要的情况下,唯一应该执行的优化是算法优化。
  • @DavidSchwartz 好吧,您必须选择一个,如果出于某种原因,最好选择一个,即使它只是代码可读性,不一定是执行时间。
  • 没错。所以忘记代码执行时间或内存。应该选择哪个更清楚地表达程序员的意图。
  • 先发制人的微优化从来都不是一个好主意。微优化在 95% 的情况下什么都不做。如果你要进行微优化,首先确定你有一个瓶颈,然后分析你的代码,然后进行调整、测量并确保它们是有效的。在编写代码时,可读性等是关键。
  • @AnubianNoob 在什么情况下哪个更易读?

标签: java if-statement optimization short-circuiting


【解决方案1】:

它们被编译成相同的字节码。没有性能差异。

可读性是唯一的区别。作为一个巨大的概括,短路看起来更好,但嵌套更清晰。它真的归结为特定的用例。我通常会短路。


我试过了。代码如下:

public class Test {

    public static void main(String[] args) {
        boolean a = 1>0;
        boolean b = 0>1;

        if (a && b)
            System.out.println(5);

        if (a)
            if (b)
                System.out.println(5);
    }
}

这编译为:

  0: iconst_1
  1: istore_1
  2: iconst_0
  3: istore_2
  4: iload_1
  5: ifeq          19
  8: iload_2
  9: ifeq          19
 12: getstatic     #2
 15: iconst_5
 16: invokevirtual #3
 19: iload_1
 20: ifeq          34
 23: iload_2
 24: ifeq          34
 27: getstatic     #2
 30: iconst_5
 31: invokevirtual #3
 34: return

注意这个块如何重复两次:

  4: iload_1
  5: ifeq          19
  8: iload_2
  9: ifeq          19
 12: getstatic     #2
 15: iconst_5
 16: invokevirtual #3

两次相同的字节码。

【讨论】:

    【解决方案2】:

    如果您有一个与每个 if 相关联的 else,那会有所不同。

    if(a && b)
    {
         //do something if both a and b evaluate to true
    } else {
        //do something if either of a or b is false
    }
    

    还有这个:

    if(a)
    {
         if(b)
         {
              //do something if both a and b are true
         } else {
              //do something if only a is true
         }
    } else {
         if(b)
         {
              //do something if only b is true
         } else {
              //do something if both a and b are false
         }
    }
    

    【讨论】:

      【解决方案3】:

      如果在您的第​​二个示例中的两个 if 语句之间没有任何内容,那么肯定第一个更清晰、更易读。

      但是,如果有一段代码可以介于这两个 if 条件之间,那么唯一的方法就是第二个示例。

      【讨论】:

      • 如果您的代码应该在 a 之后但在 b 之前运行,那么您可以将其放入返回 true 的方法 c 中。那么你可以使用短路符号 a && c() && b
      【解决方案4】:

      应该没有区别,但在可读性方面我更喜欢第一个,因为它不那么冗长且缩进更少。

      【讨论】:

        猜你喜欢
        • 2016-09-08
        • 2013-08-23
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 2013-02-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        相关资源
        最近更新 更多