哪个“if”构造更快 - 语句或三元运算符?

时间:2011-01-16 16:57:29

标签: java performance if-statement shorthand premature-optimization

java中有两种类型的if语句 - 经典:if {} else {}和简写:exp ? value1 : value2。一个比另一个快还是一样?

语句:

int x;
if (expression) {
  x = 1;
} else {
  x = 2;
}

三元运营商:

int x = (expression) ? 1 : 2;

6 个答案:

答案 0 :(得分:103)

那里只有一种“if”陈述。另一个是条件表达式。至于哪个会表现得更好:他们可以编译成相同的字节码,我希望它们的行为相同 - 或者说非常接近,你绝对不希望在性能方面选择其中一个。

有时,if语句更具可读性,有时条件运算符更具可读性。特别是,当两个操作数简单且无副作用时,我建议使用条件运算符,而如果两个分支的主要目的是它们的副作用,我可能会使用if声明。

这是一个示例程序和字节码:

public class Test {
    public static void main(String[] args) {
        int x;
        if (args.length > 0) {
            x = 1;
        } else {
            x = 2;
        }
    }

    public static void main2(String[] args) {
        int x = (args.length > 0) ? 1 : 2;
    }
}

Bytecode用javap -c Test反编译:

public class Test extends java.lang.Object {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1
       4: return

  public static void main(java.lang.String[]
    Code:
       0: aload_0
       1: arraylength
       2: ifle          10
       5: iconst_1
       6: istore_1
       7: goto          12
      10: iconst_2
      11: istore_1
      12: return

  public static void main2(java.lang.String[
    Code:
       0: aload_0
       1: arraylength
       2: ifle          9
       5: iconst_1
       6: goto          10
       9: iconst_2
      10: istore_1
      11: return
}

正如你所看到的,这里的字节码存在轻微的差异 - istore_1是否发生在brance内(不像我以前的巨大缺陷尝试:)但我会如果JITter最终得到不同的原生代码,我会感到非常惊讶。

答案 1 :(得分:10)

您的两个示例都可能编译为相同或几乎相同的字节码,因此性能应该没有区别。

如果执行速度有所不同,你仍然应该使用最惯用的版本(这将是第二个基于简单条件和两个简单​​子表达式分配单个变量的版本,第一个用于执行更复杂的操作或操作,不适合单行)。

答案 2 :(得分:8)

这些都是一样的。两者都相当快,通常约10-30纳秒。 (取决于使用模式)这个时间范围对您来说很重要吗?

你应该做你认为最清楚的事。

答案 3 :(得分:4)

只是为了添加所有其他答案:

第二个表达式通常称为三级/三元运算符/语句。它非常有用,因为它返回一个表达式。有时它会使代码对于典型的简短陈述更清晰。

答案 4 :(得分:3)

两者都没有 - 它们将被编译为相同的。

答案 5 :(得分:0)

三元运算符比if-else条件要快。

public class TerinaryTest {
    public static void main(String[] args)
    {
        int j = 2,i = 0;
        Date d1 = new Date();
        for(long l=1;l<100000000;l++)
            if(i==1) j=1;
                else j=0;
        Date d2 = new Date();
        for(long l=1;l<100000000;l++)
            j=i==1?1:0;
        Date d3 = new Date();
        System.out.println("Time for if-else: " + (d2.getTime()-d1.getTime()));
        System.out.println("Time for ternary: " + (d3.getTime()-d2.getTime()));
    }
}

测试结果:

足迹1:

if-else时间:63

三元时间:31

Trail-2:

if-else时间:78

三元组时间:47

Trail-3:

if-else时间:94

三元时间:31

足迹4:

if-else时间:78

三元组时间:47