Оптимизация Java: локальная переменная или вызов функции

Что бы вы сделали?

 doThings(folder.getInstructions()) ;
 for (Instruction instruction : folder.getInstructions()) {
    // do things
 }
functionCall(folder.getInstructions()) ;

Или это:

instructions = folder.getInstructions() ;
doThings(instructions)
for (Instruction instruction : instructions) {
  // do things
}
functionCall(instructions) ;

Прежде всего, я хотел бы знать, когда более эффективно хранить значение в локальной переменной и когда лучше выполнять вызовы функций.

Ответ 1

Более читаемый более эффективен. Временным выражениям и локальным переменным требуется одинаковое пространство, а с точки зрения ЦП /JVM это не имеет большого значения. JVM будет лучше оптимизировать/внедрить его.

Однако, если вызов метода getInstructions() стоит дорого, кешируйте его в локальной переменной. Если это просто обычный геттер, он все равно будет встроен. Также IMHO в вашем конкретном случае локальная переменная более читаема и, возможно, даже правильнее, если getInstructions() может иметь разные результаты с течением времени.

Ответ 2

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

Если, с другой стороны, getInstructions() нужно создать десяток веб-запросов, то ясно, что вы хотите не называть их несколько раз.

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

for (int i = 0; i < text.length(); i++) {
    ...
}

а не разбить это на отдельную переменную:

int length;
for (int i = 0; i < length; i++) {
    ...
}

Это действительно зависит от контекста. Иногда дополнительная переменная помогает, иногда это не так, с точки зрения читаемости. Взгляд на эффективность полностью зависит от того, что делает вызов метода, и является ли он "встроенным" для JIT.

Ответ 3

Всякий раз, когда вы хотите использовать результат метода более одного раза, лучше хранить результат вызова метода в некоторой временной переменной. Это экономит время обработки вызова метода. Это не повлияет на это в этом случае. case.. Но может повлиять на много вызовов..

Кроме того, помните, что ваши локальные переменные хранятся на stack. Таким образом, временная локальная переменная занимает пространство в стеке. Хотя это мало что вызывает беспокойство в таких небольших случаях, как этот.. Но ненужных локальных переменных следует избегать.

Итак, для обоих методов существуют профи и минус.

Ответ 4

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

Первый блок кода лучше, если значения быстро изменяются во время приложения. Это хорошо, если вам нужны точные результаты.

Второй вариант хорош, если вы уверены, что исходные значения не повлияют на другие части кода.

Ответ 5

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

и если вам нужно вызвать функцию только один раз. не нужно искать локальные переменные.