Как правильней объявить переменную?
В программе использую int переменную. Объявляю её в самом начале класса. Эта переменная будет использоваться только в одном методе этого класса. Но этот метод будет вызываться программой в цикле практически непрерывно. AndroidStudio предлагает мне сделать эту переменную локальной, т.е. объявить её прямо в том методе, где она будет использоваться. Но в результате этого в цикле будет выполняться её циклическая инициализация. Работать программа будет правильно. Но, мне кажется, что в результате программа будет выполнять ненужные действия: постоянно инициализировать переменную. Или я не правильно понимаю принципы работы андроида? Может быть он не тратит на инициализацию никаких вычислительных ресурсов? И правильнее инициализировать переменную именно внутри метода? И дополнительно - если вместо int будет объявляться объект (String, Integer, Point...), как в этом случае поступать?
Ответы (1 шт):
Я тут ради спортивного интереса решил проверить, накидал код
long time_start;
int summ_2;
SecureRandom secureRandom = new SecureRandom();
Thread myThread_run = new Thread(() -> {
Log.e("Время", "Старт 1 варианта");
time_start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
int summ = secureRandom.nextInt() + secureRandom.nextInt();
}
Log.e("Время", "Интервал 1 варианта, мсек - " + (System.currentTimeMillis() - time_start));
Log.e("Время", "Старт 2 варианта");
time_start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
summ_2 = secureRandom.nextInt() + secureRandom.nextInt();
}
Log.e("Время", "Интервал 2 варианта, мсек - " + (System.currentTimeMillis() - time_start));
});
myThread_run.start(); // запускаем
Что получилось по логам
E/Время: Старт 1 варианта
I/sic: Background concurrent copying GC freed 172964(2MB) AllocSpace objects, 1(20KB) LOS objects, 49% free, 3MB/6MB, paused 324us total 105.985ms
I/sic: Explicit concurrent copying GC freed 76131(1426KB) AllocSpace objects, 0(0B) LOS objects, 50% free, 2MB/5MB, paused 337us total 32.615ms
E/Время: Интервал 1 варианта, мсек - 88112
E/Время: Старт 2 варианта
I/sic: Background concurrent copying GC freed 173623(2MB) AllocSpace objects, 1(20KB) LOS objects, 50% free, 2MB/5MB, paused 8.444ms total 39.587ms
I/si: Waiting for a blocking GC ProfileSaver
I/sic: WaitForGcToComplete blocked ProfileSaver on HeapTrim for 21.207ms
E/Время: Интервал 2 варианта, мсек - 80947
Если использовать 1 миллион итераций, то разница в 100 мс. А вот предупреждения сборщика мусора нужно принимать в расчёт