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

Java 中有两种类型的语句 - 经典:和速记:。是一个比另一个更快还是相同?ifif {} else {}exp ? value1 : value2

陈述:

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

三元运算符:

int x = (expression) ? 1 : 2;

答案 1

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

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

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

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;
    }
}

字节码反编译为 :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
}

如您所见,这里的字节码略有不同 - 无论是否发生在brance内(与我之前存在巨大缺陷的尝试:)但是如果JITter最终使用不同的本机代码,我会感到非常惊讶。istore_1


答案 2

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

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


推荐