假设我在Java 8(特别是Android)中做了类似的事情
String name = someObject.getName() != null ? someObject.getName() : "null";
和方法getName()
可能需要调用许多其他方法来解析名称。还要假设我经常调用此代码。
从性能角度考虑,改做这样的事情会更好吗?
String name = someObject.getName();
name = name != null ? name : "null";
答案 0 :(得分:5)
这似乎是一种可能的优化,称为CSE; const firstName = "john";
const secondName = "jenny";
stringFormat('hello {0} and {1}',firstName , secondName) // outputs hello john and jenny
AFAIK可以做到这一点(但不确定Android)。
但是,如果JVM
在内部分配其他对象并执行其他操作,则这在很大程度上取决于getName
的操作。不幸的是,在这里我什至不知道怎么证明我是错误的还是正确的(可能需要调查)。老实说,我有一个自己做这个习惯。例如:
for(int i=0;i<list.size();++i){
}
我总是尝试在循环之前提取int size = list.size()
;即使根据我的理解,这需要进行scalar replacement
优化。
答案 1 :(得分:0)
第二个版本一次调用getName
,而第一个版本(如果不为null的话)调用了2次……因此,如果它很重,第二个版本会更好。
正如Arnaud所说,您必须考虑该值是否可以在两个调用之间改变:在这种情况下,您将获得性能上的提升,但是有获得“旧”值的风险。