Оптимизированы ли несколько вызовов одного и того же метода в одном и том же операторе оптимизатором? - PullRequest
0 голосов
/ 25 сентября 2018

Допустим, я делаю что-то подобное в Java 8 (особенно для Android)

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

, а метод getName() может иметь много вызовов других методов для разрешения имени.Также предположим, что я вызываю этот код довольно часто.

Было бы лучше, с точки зрения производительности, сделать что-то подобное вместо этого?

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Это похоже на возможную оптимизацию, которая называется CSE ;JVM AFAIK делает это (но не уверен насчет Android).

Но это сильно зависит от того, что делает getName, если он выделяет внутри себя другие объекты и делает некоторые другие вещи.К сожалению, я даже не могу сказать, как доказать , что я ошибаюсь или прямо здесь (возможно, придется провести расследование);честно говоря, у меня есть привычка делать это самостоятельно.Например:

for(int i=0;i<list.size();++i){

}

Я стараюсь всегда извлекать int size = list.size() перед циклом;даже если это в моем понимании подлежит scalar replacement оптимизации.

0 голосов
/ 25 сентября 2018

Вторая версия вызывает getName один раз, в то время как первая, если значение не равно нулю, вызывает 2 раза ... поэтому, если она очень тяжелая, вторая версия лучше.

Как сказал Арно, вы должны подумать, может ли значение измениться между двумя вызовами: в этом случае вы получите повышение производительности, но риск получить «старое» значение.

...