Объявление локальных переменных в циклах
От: Foror http://foror.ru
Дата: 27.03.07 09:20
Оценка:
цикл {
Object obj = new Object();
}

или

Object obj = null;

цикл {
obj = new Object();
}


Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?
Re: Объявление локальных переменных в циклах
От: Gajdalager Украина  
Дата: 27.03.07 09:30
Оценка:
Здравствуйте, Foror, Вы писали:


F>цикл {
F> Object obj = new Object();
F>}



F>или


F>Object obj = null;
F>цикл {
F> obj = new Object();
F>}


F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?

Во втором случае obj доступен за пределами цикла. Теоретически, если ты к нему не обращаешься за пределами цикла, компилятор мог бы провести оптимизацию и поместить объявление переменной в тело цикла, но не думаю, что он так делает Так что да, разница есть. Еще момент — обьект, созданный при последнем проходе, не будет доступным для сборщика мусора, пока obj не выйдет из области видимости.
Re: Объявление локальных переменных в циклах
От: Blazkowicz Россия  
Дата: 27.03.07 09:35
Оценка: +1
Здравствуйте, Foror, Вы писали:

F>цикл {

F> Object obj = new Object();
F>}

F>или


F>Object obj = null;


F>цикл {

F> obj = new Object();
F>}


F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?


В первом случае не будет операции присвоения null. В остальном разницы быть не должно. Хотя не знаю как на счет случая если obj ещё используется поле цикла. Но мы ведь его не рассматриваем?
Re[2]: Объявление локальных переменных в циклах
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 27.03.07 09:37
Оценка:
Здравствуйте, Gajdalager, Вы писали:

G>Во втором случае obj доступен за пределами цикла. Теоретически, если ты к нему не обращаешься за пределами цикла, компилятор мог бы провести оптимизацию и поместить объявление переменной в тело цикла, но не думаю, что он так делает ...


А в чем здесь оптимизация? Вот когда компилятор из цикла выносит объявление переменной, это да, на этом оптимизируется выделение байт (4?), нужных для хранения адреса объекта.
http://denis-zhdanov.blogspot.com
Re: Объявление локальных переменных в циклах
От: C0s Россия  
Дата: 27.03.07 09:40
Оценка: +5
Здравствуйте, Foror, Вы писали:

F>Есть ли разница между этими двумя блоками?


надо стремиться к сокращению области видимости объекта. т.е. если объект за пределами цикла не нужен, то объявлять его надо внутри. это, как минимум, хороший стиль.
Re: Объявление локальных переменных в циклах
От: Donz Россия http://donz-ru.livejournal.com
Дата: 27.03.07 11:04
Оценка:
Здравствуйте, Foror, Вы писали:

F>цикл {

F> Object obj = new Object();
F>}

F>или


F>Object obj = null;


F>цикл {

F> obj = new Object();
F>}


F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?


Здесь: http://forum.juga.ru/showthread.php?s=&threadid=8457 как раз обсуждали и пришли к выводу, что без разницы. В твоём случае, как уже сказали, во втором примере будет ещё одно присвоение null
Re: Объявление локальных переменных в циклах
От: Дмитрий В  
Дата: 27.03.07 11:35
Оценка:
Здравствуйте, Foror, Вы писали:

F>цикл {

F> Object obj = new Object();
F>}

F>или


F>Object obj = null;


F>цикл {

F> obj = new Object();
F>}


F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?

если снаружи переменная не используется, на кой черт она там обьвляется? Чтобы разобраться впоследствие в этом коде было сложнее?
Re: Объявление локальных переменных в циклах
От: JSerge Россия  
Дата: 27.03.07 12:24
Оценка:
Здравствуйте, Foror, Вы писали:

F>цикл {

F> Object obj = new Object();
F>}

F>или


F>Object obj = null;


F>цикл {

F> obj = new Object();
F>}


F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?



Все просто. Есть такая прога — jad; надо скомпилировать два упомянутых примера, раз-jad'ить class'ы и посмотреть. Разницы нет.
Можно еще проще — сравнить размеры class'ов.
Re[2]: Объявление локальных переменных в циклах
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 27.03.07 12:31
Оценка:
Здравствуйте, JSerge, Вы писали:

JS>Все просто. Есть такая прога — jad; надо скомпилировать два упомянутых примера, раз-jad'ить class'ы и посмотреть. Разницы нет.

JS>Можно еще проще — сравнить размеры class'ов.

В результате предложенных действий можно узнать, как компилятор определенной версии определенного производителя строит этот фрагмент кода. Автор же, насколько я понял, имел ввиду нечто более общее, что-то вида 'позволено ли компилятору заоптимизировать предложенный кусок таким образом, чтобы объявление локальной переменной цикла было расположено вне цикла'.
Ответ имхо да (с точки зрения логики), но для стопроцентной уверенности все равно надо смотреть спеку.
http://denis-zhdanov.blogspot.com
Re[2]: Объявление локальных переменных в циклах
От: dotidot Россия  
Дата: 27.03.07 12:34
Оценка:
Здравствуйте, Дмитрий В, Вы писали:
хм. а вот интересно:
public class PerfomanceHit {
    private static final int MAXIMUM_ITER = 1000000000;

    static void test1() {
        for (int i = 0; i < MAXIMUM_ITER; i++)
            ;
    }

    static void test2() {
        for (int i = 0; i < MAXIMUM_ITER;) {
            i++;
        }
    }

    static void test3() {
        int i = 0;
        while (i < MAXIMUM_ITER) {
            i++;
        }
    }

    private static void printTime(String message, long stamp) {
        System.out.printf(message + " Dt = %fs\n", ((double) System
                .currentTimeMillis() - stamp) / 1000);
    }

    public static void main(String[] args) {
        test1();
        test2();
        test3();
        long stamp = System.currentTimeMillis();
        test1();
        printTime("Test1 ", stamp);
        stamp = System.currentTimeMillis();
        test2();
        printTime("Test2 ", stamp);
        stamp = System.currentTimeMillis();
        test3();
        printTime("Test3 ", stamp);
    }
}

усредненные результаты по нескольким прогонам:
Test1  Dt = 1,922000s
Test2  Dt = 1,922000s
Test3  Dt = 1,922000s

Вывод: тема не стоит потраченного на неё времени
Re[2]: Объявление локальных переменных в циклах
От: Blazkowicz Россия  
Дата: 27.03.07 12:38
Оценка:
Здравствуйте, JSerge, Вы писали:


JS>Все просто. Есть такая прога — jad; надо скомпилировать два упомянутых примера, раз-jad'ить class'ы и посмотреть. Разницы нет.

JS>Можно еще проще — сравнить размеры class'ов.

Есть такая прога javap. Можно запустить с опцией -с и посмотреть какая разница в байткоде.
Re[3]: Объявление локальных переменных в циклах
От: Blazkowicz Россия  
Дата: 27.03.07 12:41
Оценка:
Здравствуйте, dotidot, Вы писали:

D>хм. а вот интересно:

D>Вывод: тема не стоит потраченного на неё времени

Не перфомансом единым живет код.
Re[3]: Объявление локальных переменных в циклах
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 27.03.07 12:49
Оценка: +1
Здравствуйте, dotidot, Вы писали:

D>...

D>Вывод: тема не стоит потраченного на неё времени

На самом деле, приведенный тест вообще ничего не показывает, потому что он не делает того, что задумывалось.
JIT-компилятор либо вместо цикла сделает прямой инкремент переменной на нужное число, либо, что более вероятно, вообще выкинет вызов метода. Подробнее об искусстве не наступания на грабли во время построения микротеста можно почитать здесь
http://denis-zhdanov.blogspot.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.