Возможный дубликат:
где вы объявляете переменные? Вершина метода или когда они вам нужны?
Имеет ли значение, если я объявляю переменные внутри или вне цикла в Java?
Это
for(int i = 0; i < 1000; i++) {
int temp = doSomething();
someMethod(temp);
}
равно этому (в отношении использования памяти)?
int temp = 0;
for(int i = 0; i < 1000; i++) {
temp = doSomething();
someMethod(temp);
}
А что, если временная переменная, например, ArrayList?
for(int i = 0; i < 1000; i++) {
ArrayList<Integer> array = new ArrayList<Integer>();
fillArray(array);
// do something with the array
}
РЕДАКТИРОВАТЬ: с javap -c
я получил следующий вывод
Переменная вне цикла:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_2
5: sipush 1000
8: if_icmpge 25
11: invokestatic #2 // Method doSomething:()I
14: istore_1
15: iload_1
16: invokestatic #3 // Method someMethod:(I)V
19: iinc 2, 1
22: goto 4
25: return
Переменная внутри цикла:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 23
9: invokestatic #2 // Method doSomething:()I
12: istore_2
13: iload_2
14: invokestatic #3 // Method someMethod:(I)V
17: iinc 1, 1
20: goto 2
23: return
А для интересующихся этот код:
public class Test3 {
public static void main(String[] args) {
for(int i = 0; i< 1000; i++) {
someMethod(doSomething());
}
}
private static int doSomething() {
return 1;
}
private static void someMethod(int temp) {
temp++;
}
}
производит это:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 21
9: invokestatic #2 // Method doSomething:()I
12: invokestatic #3 // Method someMethod:(I)V
15: iinc 1, 1
18: goto 2
21: return
Но тогда оптимизация происходит во время выполнения. Есть ли способ посмотреть на оптимизированный код? (Простите за долгое редактирование)
Ответы:
Общий ответ на большинство из этих вопросов должен быть «почему бы вам не попробовать и выяснить?». В Java вы, вероятно, могли бы взглянуть на сгенерированный байт-код (я считаю, что инструмент называется javap), чтобы увидеть, в чем разница в байт-коде между этими двумя способами объявления переменной.
Делать так лучше для вас, потому что в следующий раз, когда вы столкнетесь с проблемой оптимизации, вы можете использовать тот же инструмент для проверки того, что компилятор делает то, что вы ожидаете - это поможет вам избежать ненужного изменения кода стиль, когда оптимизатор работает хорошо сам по себе, или поиск реальных настроек, когда вам действительно нужен последний бит производительности.
источник
Краткий ответ: нет. Подобные вопросы уже были где-то на этом сайте. Нет заметного различия согласно сгенерированному байт-коду. Объявление их при необходимости дает меньше строк кода
Вот принятый ответ: /software//a/56590/43451
источник
На уровне отдельной переменной нет существенных различий в эффективности, но если бы у вас была функция с 1000 циклами и 1000 переменных (не говоря уже о плохом стиле), могут быть системные различия, потому что все жизни всех переменных будут то же самое вместо перекрытия. Это может повлиять на такие вещи, как размер стека и способность сборщика мусора очищать переменные, которые оставались в живых дольше, чем необходимо.
Кроме того, гораздо лучше использовать переменные с наименьшей возможной областью действия. Это предотвращает несчастные случаи.
источник