Лучше ли снова хранить значение как переменную или вызывать метод? - PullRequest
7 голосов
/ 01 августа 2010

Недавно я начал изучать Java.Из того, что я уже узнал о JVM, похоже, что JIT делает это довольно быстро на операциях, требующих циклов ЦП (т. Е. Вызывает метод), но также делает его голодным для памяти.Поэтому, когда мне нужен тот же вывод из того же метода, что и раньше, лучше ли вообще сохранять выходные данные в переменной и использовать их снова - при этом все время удерживая их в памяти - или снова вызывать тот же метод?

Ответы [ 5 ]

10 голосов
/ 01 августа 2010

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

4 голосов
/ 02 августа 2010

Как я понимаю вопрос, он спрашивает, что лучше

Bar bar = foo.getBar();
bar.donkey();
...
bar.kong();

или

foo.getBar().donkey();
...
foo.getBar().kong();

Если getBar не дорого, вряд ли будут существенные различия в производительности. Кроме того, память вряд ли будет проблемой. Сконцентрируйтесь на понятности.

Есть разные мнения.

Я полагаю, что Мартин Фаулер предпочитает последнее. Код является независимым, и, вероятно, его легче реорганизовать.

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

С другой стороны, вы можете захотеть включить что-то вроде:

foo.donkey();
...
foo.kong();
2 голосов
/ 01 августа 2010

Создание временной переменной вряд ли будет медленнее .

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

Biz nibb = getBiz();
frobnicate(nibb.foo(), nibb.bar());
galuncify(nibb.bar());

Если я решу, что вместо nibb.bar() следует использовать значение nibb.biz(), я должен не забыть заменить его в двух местах. Эта проблема не возникла бы, если бы вместо этого я использовал переменную:

Biz nibb = getBiz();
Bar bar = nibb.bar();
frobnicate(nibb.foo(), bar);
galuncify(bar);

Также обратите внимание, как вызовы методов стали более читабельными.

1 голос
/ 02 августа 2010

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

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

1 голос
/ 01 августа 2010

Есть много факторов, включая личный вкус, дороговизну метода, модификации, которые делает метод, и т. Д.

  • Для базовых методов get JavaBean / map / list я обычно вызываю дважды для возможности восстановления, но это личный вкус.То же самое с чем-то методами
  • Для более дорогих операций, которые возвращают значение (IE URL), лучше всего хранить, так как это длинная операция, чтобы выйти в Интернет, получить данные и отчитаться
  • Если метод изменяет НИЧЕГО во время извлечения данных, я сохраняю значение
...