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

问题描述 投票:108回答:9

这个问题在这里已有答案:

我倾向于“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;

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

java performance optimization
9个回答
98
投票

我使用哪个问题?

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

哪个更快?

都不是。

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

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


32
投票

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

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


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 ()); 

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

附:在To ternary or not to ternary?上非常完整的stackoverflow答案


8
投票

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


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

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;

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


0
投票

最好使用任何一个更好的读取 - 在所有实际效果0性能之间的差异。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.