编译器是否优化了同一语句中对同一方法的多次调用?

时间:2018-09-25 10:08:03

标签: java android optimization java-8 compiler-optimization

假设我在Java 8(特别是Android)中做了类似的事情

String name = someObject.getName() != null ? someObject.getName() : "null";

和方法getName()可能需要调用许多其他方法来解析名称。还要假设我经常调用此代码。

从性能角度考虑,改做这样的事情会更好吗?

String name = someObject.getName();
name = name != null ? name : "null";

2 个答案:

答案 0 :(得分:5)

这似乎是一种可能的优化,称为CSEconst 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所说,您必须考虑该值是否可以在两个调用之间改变:在这种情况下,您将获得性能上的提升,但是有获得“旧”值的风险。