2013-02-27 4 views
4

Рассмотрим следующий код:Занимает ли Eclipse неиспользуемые локальные переменные?

public String foo(){ 
     String bar = doStuff(); 
     return bar; 
} 

А потом:

public void test(){ 
     doSomeLogicHere(); 
     String result = foo(); 
} 

Заметьте, что в test я получаю строку с именем result в конце функции. Eclipse знает, что это неиспользуемая переменная, поскольку она предупреждает об этом. Что мне интересно, так ли эти строки собираются, как если бы вызов был только foo() без сохранения возвращенной строки? Если я прокомментировал String result =, когда я его не использую, я бы уменьшил потребление памяти или не имеет значения, поскольку String все еще сгенерирован и возвращен в foo()?

У меня есть логика отладки в приложении, которое я пишу именно так, и мне интересно, стоит ли комментировать все строки для выпуска/когда я их не использую.

+1

у вас на самом деле есть две неиспользуемые переменные здесь - foo и bar. Ваша вторая строка теста() может просто сказать doStuff(). Если код не будет оптимизирован, распределение памяти будет находиться в стеке (а не куче) для двух локальных переменных (bar & result), и они будут распределены и де-распределены при абсолютно минимальных затратах. –

+0

Разве это не плохой пример? метод 'foo()' может фактически делать что-то важное, но мы просто не используем его результат. – Sandy

ответ

1

Насколько я знаю, компилятор автоматически не удаляет неиспользуемые переменные. Обычно это работа для оптимизаторов/обфускаторов.

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

+0

О, учитывая, что это приложение для Android, я полагаю, что мне не нужно беспокоиться об этом, потому что ProGuard удалит его. –

+0

Да, это правильно. – l46kok

1

Назначение result не будет иметь разницы в производительности: Java JIT в JVM будет оптимизировать эти неиспользуемые переменные почти во всех случаях.

Я лично исправляю такие вещи только для того, чтобы мой код был чистым и безошибочным.

+0

Таким образом, он не компилируется, скажем, но во время выполнения он «точно вовремя скомпилирован» JIT, так что разница в том, оставила ли я его или нет, ничтожно мала. –

+0

Да, это в основном суть. Хотя я думаю, что это зависит от реализации, независимо от того, пытается ли исходный компилятор Java удалить назначение (это не имеет значения, поскольку JIT будет делать это в любом случае). Некоторые могут это сделать: если вам интересно, вы можете проверить сгенерированный байт-код, чтобы быть уверенным. – mikera

Смежные вопросы