三元运算符是否比Java中的“if”条件更快

时间:2012-03-16 22:38:23

标签: java performance optimization

我倾向于“ if-conditional syndrome ”,这意味着我倾向于一直使用条件。我很少使用三元运算符。例如:

//I like to do this:
int a;
if (i == 0)
{
    a = 10;
}
else
{
    a = 5;
}

//When I could do this:
int a = (i == 0) ? 10:5;

我使用的是否重要?哪个更快?是否存在显着的性能差异?尽可能使用最短的代码是更好的做法吗?

9 个答案:

答案 0 :(得分:98)

  

我使用的是否重要?

是的!第二个更具可读性。你正在交易一行,它简明扼要地表达你想要的九行有效混乱。

  

哪个更快?

都不是。

  

尽可能使用最短的代码是更好的做法吗?

不是“只要有可能”,但在任何可能的情况下都不会产生不利影响。较短的代码至少可能更具可读性,因为它侧重于相关部分而不是偶然影响(“样板代码”)。

答案 1 :(得分:32)

如果 任何性能差异(我怀疑),它将是微不足道的。专注于编写最简单,最易读的代码。

话虽如此,试着克服你对条件运算符的厌恶 - 虽然它有可能过度使用它,但在某些情况下它可能真的有用。在您给出的具体示例中,我绝对使用条件运算符。

答案 2 :(得分:27)

三元运算符示例:

int a = (i == 0) ? 10 : 5;

你不能像if / else那样做任务:

// invalid:
int a = if (i == 0) 10; else 5;

这是使用三元运算符的一个很好的理由。如果您没有作业:

(i == 0) ? foo () : bar ();

if / else不是那么多代码:

if (i == 0) foo (); else bar ();

在性能危急情况下:测量它。如果存在瓶颈,请使用目标机器(目标JVM)和典型数据进行测量。否则为了便于阅读。

在上下文中,简短形式有时非常方便:

System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ()); 

答案 3 :(得分:15)

是的,这很重要,但不是因为代码执行性能。

与简单的语法结构相比,更快(高性能)编码与循环和对象实例化更相关。编译器应该处理优化(它将完全相同的二进制文件!)所以你的目标应该是你从未来的效率(人类永远是软件的瓶颈)。

Josh Bloch's "Performance Anxiety" talk on Parleys.com

引用9行与1行的答案可能会产生误导:较少的代码行并不总是更好。 在有限的情况下,三元运算符可以更简洁(你的例子很好)。

但是他们经常被滥用来使代码不可读(这是一个主要的罪恶)=不要嵌套三元运算符!

还要考虑未来的可维护性,if-else更容易扩展或修改:

int a;
if ( i != 0 && k == 7 ){
    a = 10;
    logger.debug( "debug message here" );
}else
    a = 3;
    logger.debug( "other debug message here" );
}


int a = (i != 0 && k== 7 ) ? 10 : 3;  // density without logging nor ability to use breakpoints

P.S。非常完整的stackoverflow答案To ternary or not to ternary?

答案 4 :(得分:8)

三元运营商只是简写。它们编译成等效的if-else语句,这意味着它们完全相同。

答案 5 :(得分:4)

此外,三元运算符启用“可选”参数的形式。 Java不允许方法签名中的可选参数,但是三元运算符使您可以在为参数值提供null时轻松内联默认选项。

例如:

public void myMethod(int par1, String optionalPar2) {

    String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
            .trim()
            .toUpperCase(getDefaultLocale());
}

在上面的示例中,将null作为String参数值传递给您一个默认字符串值而不是NullPointerException。它简短而甜蜜,我想说,非常可读。而且,正如已经指出的那样,在字节码级别,三元运算符和if-then-else之间确实没有区别。如上例所示,决定选择哪一项完全取决于可读性。

此外,通过重载方法,使用此模式可以使String参数真正可选(如果认为这样做有用):

public void myMethod(int par1) {
    return myMethod(par1, null);
}

答案 6 :(得分:1)

对于给出的示例,出于特定原因,我更喜欢三元或条件运算符(?):我可以清楚地看到赋值a不是可选的。举一个简单的例子,扫描if-else块并不难看出每个子句中都分配了a,但想象每个子句中有几个赋值:

if (i == 0)
{
    a = 10;
    b = 6;
    c = 3;
}
else
{
    a = 5;
    b = 4;
    d = 1;
}

a = (i == 0) ? 10 : 5;
b = (i == 0) ? 6  : 4;
c = (i == 0) ? 3  : 9;
d = (i == 0) ? 12 : 1;

我更喜欢后者,以便你知道你没有错过任务。

答案 7 :(得分:0)

最好使用任何一个读得更好的东西 - 在所有实际效果中,性能之间存在差异。

在这种情况下,我认为最后一个语句比第一个if语句读得更好,但要注意不要过度使用三元运算符 - 有时它确实会使事情变得不那么清楚。

答案 8 :(得分:0)

尝试使用switch case语句,但通常不是性能瓶颈。