2010-04-06 5 views
5

jeśli mam kodrobi Java getter ponieść karę wydajności

int getA(){ 
return a; 
} 

a następnie zrobić coś takiego

int b = obj.getA(); 

zamiast

int b = obj.a; 

będzie to oznaczać, że w stosie będzie musiał być popchnięty i popaprany, ostatecznie spowalniając mój kod?

+1

Wydajność w próżni pytania są bezużyteczne. Profiluj to samodzielnie, po określeniu go w pasmie wrażliwym na wydajność w aplikacji. – djechlin

Odpowiedz

4

Kompilator JIT będzie wstawiał tę metodę.

Kod powinien wyglądać

int b = obj.GetA(); 
+0

To nie jest poprawne. Kompilator C/C++ wbuduje tego rodzaju funkcję, ale w Javie nie można tego zrobić, ponieważ maszyna wirtualna nie wie, czy funkcja będzie się do niej odwoływać (za pomocą AOP, AspectJ itp.). – cletus

+1

@cletus VM interpretuje wszystkie instrukcje kodu bajtowego Java, a więc jest tego świadomy - nawet modyfikacje wykonane przez narzędzia tkackie kodu bajtowego, takie jak AspectJ –

+0

@binil, Michael: Jak to działa, chyba że getter jest ostateczny? A co z podklasami, które nadpisują getter? – Thilo

3

Mam dwie odpowiedzi dla Ciebie:

  1. Nie sądzę, że istnieje znacząca kara wydajność za pomocą getter vs dostępu do zmiennej bezpośrednio . Martwiłbym się bardziej o to, jak zrozumiały i czytelny jest kod, niż wydajność tego rodzaju decyzji.
  2. Zgodnie z zasadami projektowania OO, które mogą, ale nie muszą być dla Ciebie ważne, zwykle ukrywasz dane i udostępniasz metodę pobierającą, aby uzyskać do nich dostęp. — Istnieje szczegółowa dyskusja na temat zalet tego podejścia here.
+0

Z drugiej strony, metody 'get' często łamią hermetyzację (szczególnie jeśli towarzyszy im metoda' set'). –

1

Teoretycznie istnieje pewne obciążenie runtime, spowodowane wywołaniem metody. W rzeczywistości, to ma bardzo niewielki wpływ na ogólną wydajność z dwóch powodów:

  1. O ile obj.getA() jest zachodzących wewnątrz wewnętrznej skrajnej pętli programu, to jego wpływ na ogólną wydajność kod będzie być nieistotnym. Kiedy wydajność jest problemem, powinieneś rozważyć wąskie gardło swojego kodu. Nie ma sensu optymalizować kodu, który nie znajduje się w tych gorących miejscach. Aby zidentyfikować te miejsca, należy przeanalizować wykonanie kodu przez profiler.
  2. Jak @Michael mówił, że JVM używa kompilatora/optymalizatora "Just In Time", który dodaje kod na podstawie faktycznego wykonania. Wykonuje właśnie tego rodzaju optymalizacje (patrz: talk)
Powiązane problemy