какой код эффективней
От: Аноним  
Дата: 26.06.13 16:12
Оценка:
String abc= myClass.getAbc();
  if(abc != null && !abc.equalsIgnoreCase("abc"))

или
  if(myClass.getAbc() != null && !myClass.getAbc().equalsIgnoreCase("abc"))
Re: какой код эффективней
От: avpavlov  
Дата: 26.06.13 16:36
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:


А>
А>String abc= myClass.getAbc();
А>  if(abc != null && !abc.equalsIgnoreCase("abc"))
А>

А>или
А>
А>  if(myClass.getAbc() != null && !myClass.getAbc().equalsIgnoreCase("abc"))
А>


Оба кода — говно. Надо вот так


"abc".equalsIgnoreCase(myClass.getAbc())
Re[2]: какой код эффективней
От: Аноним  
Дата: 26.06.13 18:00
Оценка:
Здравствуйте, avpavlov, Вы писали:
вопрос был не в этом! (понятно чтобы не было NPL лучше "abc".equalsIgnoreCase(...)
вопрос : надо использовать переменныю или вызовы методов
Re[3]: какой код эффективней
От: elmal  
Дата: 27.06.13 05:22
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>вопрос : надо использовать переменныю или вызовы методов

Смотреть надо не на эффективность. Вызов метода — это копипаст. Если выделишь переменную — она служит для документирования того, что там находится. В результате читать будет легче, ибо меньше символов на строке и меньше дубликатов.
Re: какой код эффективней
От: cvetkov  
Дата: 27.06.13 05:26
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>
А>String abc= myClass.getAbc();
А>  if(abc != null && !abc.equalsIgnoreCase("abc"))
А>

А>или
А>
А>  if(myClass.getAbc() != null && !myClass.getAbc().equalsIgnoreCase("abc"))
А>


во втором случае getAbc вызовется два раза. но это не важно если getAbc простой геттер (потому что заинлайнится).
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[3]: какой код эффективней
От: Blazkowicz Россия  
Дата: 27.06.13 05:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>вопрос : надо использовать переменныю или вызовы методов

В общем случае, вариант с переменной лучше. Его проще читать. Его проще дебажить. В случае NPE сразу понятно кто был null.
Но. Любые вызовы Domain Model вида obj.getProperty().getSubProperty(), это первый тревожный звонок по поводу нарушения инкапсуляции.
Скорее всего, вариант myClass.matchAbc("abс") был бы оптимальной альтернативой.
Re[2]: какой код эффективней
От: avpavlov  
Дата: 27.06.13 08:16
Оценка:
C>во втором случае getAbc вызовется два раза. но это не важно если getAbc простой геттер (потому что заинлайнится).

А как будет инлайниться такой "простой" геттер?

public class A {
  private int b;
  public int getB() {return b;}
}

public class B extends A {
  public int getB() {return 0;}
}

public class X {
  public boolean f(A a) {return 2 == a.getB() || 1 == a.getB();}
}
Re[3]: какой код эффективней
От: PZI  
Дата: 27.06.13 15:20
Оценка: -1
Здравствуйте, avpavlov, Вы писали:


C>>во втором случае getAbc вызовется два раза. но это не важно если getAbc простой геттер (потому что заинлайнится).


A>А как будет инлайниться такой "простой" геттер?


это jit приведет к первому варианту ТС
Re[3]: какой код эффективней
От: cvetkov  
Дата: 27.06.13 16:11
Оценка:
Здравствуйте, avpavlov, Вы писали:


A>А как будет инлайниться такой "простой" геттер?

а это не простой гетер, это метод имеющий перегрузки.

поясню: простой гетер — это метод возвращающий значение поля.
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[4]: какой код эффективней
От: avpavlov  
Дата: 27.06.13 18:35
Оценка:
C>а это не простой гетер, это метод имеющий перегрузки.

C>поясню: простой гетер — это метод возвращающий значение поля.


в классе A.getB() — это метод возвращающий значение поля. Про перегрузки в момент JIT-компиляции A.getB() или X.f() ничего неизвестно.

JIT, компилируя метод X.f(), может только быть уверен только для private или final методов/классов. Твоё утверждение безаппеляционно утверждало "но это не важно если getAbc простой геттер (потому что заинлайнится)."

Я просто намекнул тебе, что не бывает "простых геттеров", какими бы простыми они тебе не казались.
Re[5]: какой код эффективней
От: cvetkov  
Дата: 27.06.13 19:00
Оценка: 14 (2) +2
Здравствуйте, avpavlov, Вы писали:

A>в классе A.getB() — это метод возвращающий значение поля. Про перегрузки в момент JIT-компиляции A.getB() или X.f() ничего неизвестно.


A>JIT, компилируя метод X.f(), может только быть уверен только для private или final методов/классов. Твоё утверждение безаппеляционно утверждало "но это не важно если getAbc простой геттер (потому что заинлайнится)."


A>Я просто намекнул тебе, что не бывает "простых геттеров", какими бы простыми они тебе не казались.

он умнее чем ты думаешь. если никаких наследников класса A не загружено то в методе f все заинлайнится. как только будет загружен класс B скомпилированная версия f будет выброшена и перекомпилирована заново.
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re: какой код эффективней
От: . Великобритания  
Дата: 27.06.13 19:05
Оценка: +1
Здравствуйте, Аноним, Вы писали:

>
>   if(myClass.getAbc() != null && !myClass.getAbc().equalsIgnoreCase("abc"))
>

Видал я такой код. Поубивать бы. Особенно когда пишут 4-5 этажные конструкции.
А по каким соображениям такой метод может быть эффективнее в принципе?
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: какой код эффективней
От: avpavlov  
Дата: 27.06.13 20:02
Оценка:
C>он умнее чем ты думаешь. если никаких наследников класса A не загружено то в методе f все заинлайнится. как только будет загружен класс B скомпилированная версия f будет выброшена и перекомпилирована заново.

хм, действительно, умнее

https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques
Re: какой код эффективней
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 03.07.13 19:50
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>String abc= myClass.getAbc();
А>  if(abc != null && !abc.equalsIgnoreCase("abc"))
А>

А>или
А>
А>  if(myClass.getAbc() != null && !myClass.getAbc().equalsIgnoreCase("abc"))
А>


Если будет загружена только одна реализация getAbc (при загрузке второго класса с другой реализацией getAbc будет выполнена деоптимизация) и getAbc будет заинлайнен (определяется профилем, собранным при запуске приложения, а так же зависит от размера метода, по умолчанию — 35 байт) то есть шанс, что после инлайнинга сработает common subexpression elimination, и переменная для хранения результата работы myClass.getAbc будет сгенерирована автоматически. CSE имеет больше шансов сработать, если в методе getAbc нет циклов, условий и побочных эффектов, например, присвоений значений полям объекта. Для простого геттера все условия, кроме первого, будут гарантированно выполнены. Первое же условие выполнится, если данный код вызывается часто, т.е. если вообще имеет смысл его оптимизировать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.