Оптимизация компилятора Java - PullRequest
1 голос
/ 27 февраля 2012

Нужно ли беспокоиться о производительности в приведенном ниже случае и сохранить результат дорогого вызова, или компилятор распознает, что он может выполнить дорогой вызов один раз?

Ответы [ 5 ]

2 голосов
/ 27 февраля 2012

Компилятор не будет (в общем) выполнять вызов только один раз, так как он может иметь побочные эффекты или может быть нестабильным в результате - он не мог знать, когда вы хотели, чтобы он проигнорировал второй вызов, и когда вы хотели это на самом деле сделать звонок снова. Вам необходимо сохранить результат:

final ExpensiveCallResult nullableResult = object.expensiveCall();
String name;
if (nullableResult != null) {
  name = nullableResult.getName();
}
1 голос
/ 27 февраля 2012

Вы ищете что-то под названием памятка . Этот вопрос говорит о том, что Java не может сделать это изначально.

В общем, запоминание возможно, только если компилятор / JIT может доказать, что функция не имеет побочных эффектов.Так что я бы на это не рассчитывал.

Но разве так сложно просто сохранить результат?

String name;
ObjectType temp = object.expensiveCall();
if (temp != null) {
    name = temp.getName();
}
0 голосов
/ 27 февраля 2012

В будущем вы можете скомпилировать и декомпилировать свой класс обратно с помощью JAD , чтобы увидеть оптимизации компилятора.

В вашем случае ничего не оптимизируется.

0 голосов
/ 27 февраля 2012

Нет, вам нужно будет переписать его, чтобы сделать вызов только один раз:

String name;
MyResult result = object.expensiveCall();
if (result != null) {
  name = result.getName();
}

Вы также можете сократить синтаксис для назначения и проверки в той же строке:

String name;
MyResult result;
if ((result = object.expensiveCall()) != null) {
  name = result.getName();
}
0 голосов
/ 27 февраля 2012

Как мог компилятор Java знать, что expensiveCall не имеет побочных эффектов? В общем случае - не может. Также: вы можете перекомпилировать класс object в любое время без перекомпиляции вашего текущего класса. А что будет, если у expensiveCall есть побочные эффекты сейчас ? Нет способа автоматической оптимизации.

Кстати: JIT-компилятор в время выполнения может содержать больше информации. Но дорогие вызовы обычно не рассматриваются для встраивания и, следовательно, также не для дальнейших шагов оптимизации.

...