Как правильней объявить переменную?

В программе использую int переменную. Объявляю её в самом начале класса. Эта переменная будет использоваться только в одном методе этого класса. Но этот метод будет вызываться программой в цикле практически непрерывно. AndroidStudio предлагает мне сделать эту переменную локальной, т.е. объявить её прямо в том методе, где она будет использоваться. Но в результате этого в цикле будет выполняться её циклическая инициализация. Работать программа будет правильно. Но, мне кажется, что в результате программа будет выполнять ненужные действия: постоянно инициализировать переменную. Или я не правильно понимаю принципы работы андроида? Может быть он не тратит на инициализацию никаких вычислительных ресурсов? И правильнее инициализировать переменную именно внутри метода? И дополнительно - если вместо int будет объявляться объект (String, Integer, Point...), как в этом случае поступать?


Ответы (1 шт):

Автор решения: Arty Morris

Я тут ради спортивного интереса решил проверить, накидал код

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 мс. А вот предупреждения сборщика мусора нужно принимать в расчёт

→ Ссылка