【问题标题】:java "if" and "if-else" performancejava "if" 和 "if-else" 性能
【发布时间】:2012-01-17 18:51:19
【问题描述】:

我想知道这句话之间是否有区别。

public String returnSomething() {
  String result = null;
  if(isOK) {
    result = "YES";
  }
  result = "NO";
  return result;
}

还有这个

public String returnSomething() {
  String result = null;
  if(isOK) {
    result = "YES";
  } else {    
    result = "NO";
  }
  return result;
}

谁的表现最好?哪一个是最佳做法?

【问题讨论】:

  • 第一个有bug,第二个没有。
  • 如果您只是返回,那么 'return isOk 有什么问题? “是”:“否”;'
  • 如果不返回第一个如果两者根本不同。
  • 您是否尝试过运行自己的测试?这将是一个很好的起点,而不是征求人们的“意见”。
  • 为什么现在每个人都对这种小代码的性能如此着迷?!我们正在用“if”语句谈论纳秒,人类几乎不可能注意到任何差异!请问您为什么要问这个问题?

标签: java performance conditional-statements


【解决方案1】:

isOK == true 时两者不相等。第一种方法将返回“NO”,后者返回“YES”。

如果在第一个示例中将赋值放在 if 之前,它们将返回相同的结果。

【讨论】:

  • 我希望这是一个错字!
  • 哦,对不起,第一个例子应该是这样的 if(isOK) { result = "YES";返回结果; }
【解决方案2】:

如果您深入了解微处理器级别,if 和 else 条件就足够快了,因为它们只是跳过地址并跳转到由指令集组成的不同地址。所以在上述情况下,两者都同样快。

但是,无论 isOK 是什么,第一种情况总是会返回“NO”,因此从技术上讲,我会说这是错误的。

【讨论】:

    【解决方案3】:

    抛开性能不谈,这两种结构在逻辑上是不同的。
    她们不一样。

    在第一种情况下,result 将设置为No,而不管第一个if 条件是true
    在第二种情况下,仅当第一个 if 条件不是 true 时,resut 才会设置为 No

    基本上,您在这里尝试比较苹果和梨。

    【讨论】:

      【解决方案4】:

      这是条件运算符(有时也称为三元运算符)的一个很好的用例:

      public String returnSomething() {
          return isOK ? "YES" : "NO";
      }
      

      这种方法的性能应该与任何其他合理的方法相同,但是这种方法更简洁,并且在我看来更容易阅读(假设您了解条件运算符)。

      【讨论】:

        【解决方案5】:

        这在性能上没有显着差异。但是意思是有区别的。 你的第一个 sn-p 是错误的。它总是返回"NO"。我相信你想写以下内容:

        public String returnSomething() {
        
          String result = null;
        
          result = "NO";
         if(isOK) {
            result = "YES";
          }
        
          result = "NO";
        
          return result;
        }
        

        顺便说一句,这种过早的优化(甚至考虑这种优化)可能会导致问题。代码的可读性更为重要。你的代码可以改写如下:

        public String returnSomething() {
          return isOK ? "YES" : "NO";
        }
        

        我认为它更易读、更简单、更易于维护。

        【讨论】:

        • 第一个代码仍然有问题,需要删除第二行result = "NO"。我也更喜欢第二个,但我了解到它的可读性是有问题的......
        【解决方案6】:

        我认为您正在尝试做的事情如下:

        public String returnSomething() {
        
          String result = "NO";
        
          if(isOK) {
            result = "YES";
          }
        
          return result;
        }
        

        【讨论】:

          【解决方案7】:

          第一个会慢一些,因为正如@ALS 指出的那样,你在这里做两个作业。

          那是因为代码不正确:)

          【讨论】:

            【解决方案8】:

            对于你的第一个方法,结果总是设置为“NO”。

            【讨论】:

              【解决方案9】:

              您永远不应该进行这种级别的微优化!

              您很有可能会花时间以掷硬币的准确度获得答案。即使您编写了一个测试来对其进行基准测试,几乎所有此类基准测试都是在没有正确理解哪些代码在 JVM 中实际执行的情况下编写的。编译器会为您优化您的代码,并且它可能更擅长微优化,这可能会导致运行的代码与您编写的代码不同。

              即使您确实找到了哪个更快,差异也将非常微不足道,不可能导致您的软件出现任何问题。因此,任何真正的性能问题都在别处。我真诚地怀疑,对于一百万次这样的操作,它们之间的差异会超过 100 毫秒。

              【讨论】:

                【解决方案10】:

                我相信您对第一个示例的想法如下所示:

                public String returnSomething() {
                    if(isOK) {
                      return "YES";
                    }
                    return "NO";
                }
                

                因此无需创建临时变量!和第二个例子没有区别。

                编辑:我知道这只是一个示例代码,但在命名成员变量时您可能希望遵循某种约定(例如 isOK -> m_isOk)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-05-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-06
                  • 1970-01-01
                  相关资源
                  最近更新 更多