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

Rog*_*ach 81 java performance if-statement premature-optimization shorthand

ifjava中有两种类型的语句 - 经典:if {} else {}和速记:exp ? value1 : value2.一个比另一个快还是一样?

声明:

int x;
if (expression) {
  x = 1;
} else {
  x = 2;
}
Run Code Online (Sandbox Code Playgroud)

三元运算符:

int x = (expression) ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 105

那里只有一种"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,字节码在这里有一点点差别 - 无论是否istore_1发生在brance中(不像我之前的巨大缺陷尝试:)但如果JITter最终得到不同的本机代码,我会非常惊讶.

  • @Kyle:我编译了Java,然后用javap反编译. (2认同)

Vic*_*let 10

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

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


Pet*_*rey 8

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

你应该做你认为最清楚的事情.