JRu*_*ner 110 java optimization performance
我倾向于" 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;
Run Code Online (Sandbox Code Playgroud)
我使用哪个问题?哪个更快?是否存在显着的性能差异?尽可能使用最短的代码是更好的做法吗?
Kon*_*lph 102
我使用哪个问题?
是! 第二个更具可读性.你正在交易一行,它简明扼要地表达你想要的九行有效混乱.
哪个更快?
都不是.
尽可能使用最短的代码是更好的做法吗?
不是"只要有可能",但在任何可能的情况下都不会产生不利影响.较短的代码至少可能更具可读性,因为它侧重于相关部分而不是偶然影响("样板代码").
Jon*_*eet 31
如果有任何性能差异(我怀疑),它将是微不足道的.专注于编写最简单,最易读的代码.
话虽如此,试着克服你对条件运算符的厌恶 - 虽然它有可能过度使用它,但它在某些情况下确实很有用.在你给出的具体例子中,我肯定会使用条件运算符.
use*_*own 27
三元运算符示例:
int a = (i == 0) ? 10 : 5;
Run Code Online (Sandbox Code Playgroud)
你不能用if/else这样做:
// invalid:
int a = if (i == 0) 10; else 5;
Run Code Online (Sandbox Code Playgroud)
这是使用三元运算符的一个很好的理由.如果您没有作业:
(i == 0) ? foo () : bar ();
Run Code Online (Sandbox Code Playgroud)
if/else不是那么多代码:
if (i == 0) foo (); else bar ();
Run Code Online (Sandbox Code Playgroud)
在性能危急情况下:测量它.如果存在瓶颈,请使用目标机器(目标JVM)和典型数据进行测量.否则为了便于阅读.
嵌入在上下文中,简短形式有时非常方便:
System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ());
Run Code Online (Sandbox Code Playgroud)
小智 15
是的,这很重要,但不是因为代码执行性能.
与简单的语法结构相比,更快(高性能)编码与循环和对象实例化更相关.编译器应该处理优化(它将完全相同的二进制文件!)所以你的目标应该是你从未来的效率(人类永远是软件的瓶颈).
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
Run Code Online (Sandbox Code Playgroud)
ps非常完整的stackoverflow回答To三元或不三元?
此外,三元运算符启用了一种形式的“可选”参数。Java 不允许在方法签名中使用可选参数,但是当null为参数值提供时,三元运算符使您可以轻松内联默认选择。
例如:
public void myMethod(int par1, String optionalPar2) {
String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
.trim()
.toUpperCase(getDefaultLocale());
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,null作为String参数值传递会给你一个默认的字符串值而不是一个NullPointerException. 它简短而甜蜜,而且,我会说,非常易读。此外,正如已经指出的那样,在字节码级别,三元运算符和 if-then-else 之间确实没有区别。如上例所示,选择哪个的决定完全基于可读性。
此外,这种模式使您能够String通过如下重载方法使参数真正可选(如果认为这样做有用的话):
public void myMethod(int par1) {
return myMethod(par1, null);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128843 次 |
| 最近记录: |