什么在java中会更有效率? If-return-else或If-return?

时间:2012-01-13 07:30:49

标签: java performance

我只是想知道,编译器使用什么高效

if (condition) {
    return something;
} else {
    dosomething();      
}

OR

if (condition) {
    return something;
}
dosomething();

我知道这些差异非常小,而且应该选择更易读的版本,但是我们只能说我们会执行这个代码十亿次,哪一个更有效?

我也知道“现实世界”中根本没有任何收获,但我只是好奇。

6 个答案:

答案 0 :(得分:6)

没有性能差异。 bytecode包含相同的指令,以相同的顺序运行相同的数据。

   L0
    LINENUMBER 11 L0
    ICONST_1
    ISTORE 0
   L1
    LINENUMBER 12 L1
    ILOAD 0
    IFEQ L2
   L3
    LINENUMBER 13 L3
    GETSTATIC p/A.something : Ljava/lang/Object;
    ARETURN
   L2
    LINENUMBER 15 L2
   FRAME APPEND [I]
    INVOKESTATIC p/A.dosomething()V
   L4
    LINENUMBER 17 L4
    ACONST_NULL
    ARETURN
   L5
    LOCALVARIABLE condition Z L1 L5 0
    MAXSTACK = 1
    MAXLOCALS = 1

VS

   L0
    LINENUMBER 7 L0
    ICONST_1
    ISTORE 0
   L1
    LINENUMBER 8 L1
    ILOAD 0
    IFEQ L2
   L3
    LINENUMBER 9 L3
    GETSTATIC p/B.something : Ljava/lang/Object;
    ARETURN
   L2
    LINENUMBER 11 L2
   FRAME APPEND [I]
    INVOKESTATIC p/B.dosomething()V
   L4
    LINENUMBER 12 L4
    ACONST_NULL
    ARETURN
   L5
    LOCALVARIABLE condition Z L1 L5 0
    MAXSTACK = 1
    MAXLOCALS = 1

public class A {
    static Object something = new Object();
    public static void main(String[] args) { 
        test(); 
    }
    private static Object test() {
        boolean condition = true;
        if (condition) {
            return something;
        } else {
            dosomething();
        }
        return null;
    }
    private static void dosomething() {}
}

VS

public class B {
    static Object something = new Object();
    public static void main(String[] args) { 
        test(); 
    }
    private static Object test() {
        boolean condition = true;
        if (condition) { 
            return something; 
        }
        dosomething();
        return null;
    }
    private static void dosomething() {}
}

答案 1 :(得分:2)

两个版本没有任何区别。只有可能的差异纯粹来自可读性的观点。

如果采用在函数开头进行检查并且尽快执行返回的样式,则第二个就在手中。

void foo()
{
   if (condition1)
      return;
   if (goo())
      return;
   //...
}

否则,第一个版本提供更明显的分支。

答案 2 :(得分:1)

它根本不会产生重大影响。意识到else没有评估另一个表达式,只是说原始条件是否为假,请执行此操作。 Condition仍然会双向评估。

事实上,根据不同编译器所做的优化,它可能会产生相同的字节码。 IDE有很多插件可以查看Java字节码。

答案 3 :(得分:1)

任何收益都可以忽略不计,如果结果指令相同,我也不会感到惊讶。

你几乎总是更善于专注于“低悬的水果”,而不是如此小的性能微观优化。

Err在可读性方面。并始终采取措施确保您确实存在性能瓶颈。

答案 4 :(得分:1)

我怀疑性能有很大差异,但我倾向于选择后者,因为前者会导致缩进地狱。

即使执行该代码十亿次,doSomething()几乎肯定会在时间上淹没if/else

我总是首先针对可读性进行优化,并且只有在出现问题时才会担心性能。

不可读的代码远比代码稍慢的代码更具问题: - )

答案 5 :(得分:0)

我认为这只是个人偏好。

可以在此question

找到更多信息性答案