三元运算符是否比“if”条件更快
我很容易出现“ if-条件综合征 ”,这意味着我总是倾向于使用条件。 我很less使用三元运算符。 例如:
//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编程语言。
我用哪一个重要?
是! 第二个是更可读性。 你正在交易一条线,它简洁地expression了你想要对付九条有效杂乱的线路。
哪个更快?
都不是。
尽可能使用最短的代码是更好的做法吗?
不是“尽可能”,而是在任何可能的情况下,没有不利影响。 较短的代码至less可能更具可读性,因为它关注的是相关部分,而不是附带效应(“样板代码”)。
如果有任何性能差异(我怀疑),这将是微不足道的。 集中精力编写最简单,最易读的代码。
话虽如此,试着克服对条件操作符的厌恶 – 尽pipe过度使用它是有可能的,但在某些情况下它可能非常有用。 在你给的具体例子中,我肯定会使用条件运算符。
三元运算符示例:
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和典型数据来衡量它。 否则为了可读性。
embedded在上下文中,简写有时非常方便:
System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ());
是的重要,但不是因为代码执行的性能。
与简单的语法结构相比,更快(高性能)的编码更适合于循环和对象实例化。 编译器应该处理优化(这将是相同的二进制文件!),所以你的目标应该是效率,你从未来(人类总是软件的瓶颈)。
Josh Bloch在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
ps非常完整的stackoverflow答案在三元或三元?
三元运算符只是简写。 它们编译成等价的if-else
语句,意味着它们将完全相同 。
而且,三元运算符使得“可选”参数forms成为可能。 Java不允许在方法签名中使用可选参数,但三元运算符使您能够在为参数值提供null
值时轻松地内联默认选项。
例如:
public void myMethod(int par1, String optionalPar2) { String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2) .trim() .toUpperCase(getDefaultLocale()); }
在上面的示例中,传递null
作为String
参数值将为您提供默认的string值,而不是NullPointerException
。 它简短而又甜美,我可以说非常可读。 而且,正如已经指出的那样,在字节代码层次上,三元运算符和if-then-else之间确实没有区别。 就像上面的例子一样,决定select哪一个完全基于可读性。
而且,这个模式使得你可以通过重载方法使得String
参数成为可选的(如果它被认为是有用的话),如下所示:
public void myMethod(int par1) { return myMethod(par1, null); }
对于给出的例子,我更喜欢三元或条件运算符( ?
)的一个特定的原因:我可以清楚地看到,分配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;
我更喜欢后者,以便你知道你没有错过任务。
最好使用任何一个更好的读取 – 实际上在性能上有差异。
在这种情况下,我认为最后一个陈述比第一个陈述更好,但是注意不要过度使用三元运算符 – 有时它可能使事情变得不太清晰。
尝试使用switch case
。 但通常情况下,这不是瓶颈。