哪个“if”构造更快 – 语句还是三元运算符?

在java中有两种if语句 – classic: if {} else {}和shorthand: exp ? value1 : value2 exp ? value1 : value2 。 一个比另一个快吗?还是他们是一样的?

声明:

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

三元操作符:

 int x = (expression) ? 1 : 2; 

那里只有一种“if”语句。 另一个是条件expression式。 至于哪一个会更好些:它们可以编译成相同的字节码,我希望它们的行为是一致的 – 或者说如此接近以至于你绝对不会在性能方面select一个。

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

使用javap -c Test反编译的字节码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是否发生在istore_1内(不像我之前那个极其有缺陷的尝试:)但是如果JITter以不同的本地代码结束,我会感到非常惊讶。

你的两个例子都可能编译成相同或几乎相同的字节码,所以在性能上应该没有什么不同。

如果执行速度有所不同,那么您仍然应该使用最习惯的版本(这将是第二个基于简单条件和两个简单​​的子expression式分配单个variables的版本,而第一个用于执行更复杂的操作或不符合单行的操作)。

这些都是一样的。 他们两个都相当快,一般在10-30纳秒左右。 (取决于使用模式)这个时间框架对你来说很重要吗?

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

既不 – 他们将被编译为相同的。

只是添加到所有其他答案:

第二个expression式通常被称为三元/三元运算符/语句。 它可以是非常有用的,因为它返回一个expression式。 有时它会使典型的简短语句更清晰。