Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > оптимизация в java


Автор: Sleepy_PIP 28.9.2010, 20:00
подскажите пожалуста - в приведенном куске кода 
Код

            if( tag.getName() != null)
            {
                int strLen = tag.getName().length();
....
                os.write(tag.getName().getBytes());  
....
            }



сколько будет вызовов метода getName()? при условии что он возвращает только return(tagName) где tagName - String переменная экземпляра tag  (тоесть в методе нет никаких модификаций и/или вызовов других методов). как сработает оптимизатор у javac? или уже у JVM?
или все-ж для скорострельности (даже не смотря на лишний объект) лучше написать явно типа такого:
Код

            String s=tag.getName();
            if( s != null)
            {
                int strLen = s.length();
....
                os.write(s.getBytes()); 
...
            }



а если в методе есть скажем вызовы других методов, которые в свою очередь опять не содержат никаких изменений никаких данных? тогда как? 

Спасибо!

Автор: LSD 29.9.2010, 18:24
Компилятор не будет инлайнить этот метод. В принципе JIT может заинлайнить его если он объявлен в этом же классе как private или final, но тоже не факт.


Цитата(Sleepy_PIP @  28.9.2010,  21:00 Найти цитируемый пост)
ли все-ж для скорострельности (даже не смотря на лишний объект) лучше написать явно типа такого:

Тут будет не лишний объект, а лишняя ссылка, да еще и созданная в стеке. Так что "стоимость" такой ссылки намного ниже "стоимости" вызова метода.

Автор: Sleepy_PIP 29.9.2010, 18:51
Цитата(LSD @ 29.9.2010,  18:24)
Компилятор не будет инлайнить этот метод. В принципе JIT может заинлайнить его если он объявлен в этом же классе как private или final, но тоже не факт.


Цитата(Sleepy_PIP @  28.9.2010,  21:00 Найти цитируемый пост)
ли все-ж для скорострельности (даже не смотря на лишний объект) лучше написать явно типа такого:

Тут будет не лишний объект, а лишняя ссылка, да еще и созданная в стеке. Так что "стоимость" такой ссылки намного ниже "стоимости" вызова метода.

инлайнить метод может быть и не будет ... а вот сколько реально вызовов будет? .... по логике - надо всего 1 вызов, а результат - в темп переменную (ссылку в данном случае) и потом ее и использовать не вызывая повторно метод (а метод может быть ведь и "тяжелый" хотя и ничего не модифицирующий кроме результата, причем как видим результат всегда один если не модифицируются поля экземпляра класса). а?

ведь приведенный пример - только пример. 

в таком случае все-ж лучше временная переменная. да, нет?

хотя ... можно ведь по ссылке экземпляра класса (или через статики, рефлекцию и т.д. ) добраться и из другого потока до полей экземпляра на основе которых строится результат (даже если это всего 1 поле). наверное вряд-ли оптимизатор настолько умен что-б остледить подобное. да. кажется вопрос закрыт. будет вызовов метода столько сколько их написано программером ...

Автор: LSD 29.9.2010, 19:40
Цитата(Sleepy_PIP @  29.9.2010,  19:51 Найти цитируемый пост)
по логике - надо всего 1 вызов, а результат - в темп переменную (ссылку в данном случае) и потом ее и использовать не вызывая повторно метод (а метод может быть ведь и "тяжелый" хотя и ничего не модифицирующий кроме результата, причем как видим результат всегда один если не модифицируются поля экземпляра класса). а?

А если между первым и вторым вызовом метода, другой поток модифицирует переменную tagName? А если метод сложный и тяжелый, то JIT тем более не сможет определить есть ли побочные эффекты у этого метода.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)