2015-10-03 26 views
5

Biorąc pod uwagę następujących metod:zmienne lokalne: Programowanie Praktyki

public int methodOne() { 
    int total = local_int_one + local_int_two; 
    return total; 
} 

public int methodTwo() { 
    return local_int_one + local_int_two; 
} 

1) jest jedyna różnica w czytelności powyższych metod czy jest tam mikro-optymalizacja „korzyści” w methodTwo()?

2) Czy definiowanie zmiennych lokalnych w wąskim zakresie powinno być unikane, o ile jest to możliwe? (Widzę, że metoda staje się nieczytelna, jeśli w pojedynczej instrukcji trzeba wykonać kilka obliczeń)

+0

Myślę, że odpowiedziałeś na własne pytanie. –

+2

Sprawdź kod bajtu. (2) ma jedno mniej instrukcji. – EJP

+0

@EJP: co jeśli włączasz optymalizacje? Obecnie nie mam dostępu do przeglądarki kodu bajtowego Java. Ale ewidentnie tryb debugowania powoduje pewnego rodzaju mapowanie jeden na jeden. –

Odpowiedz

5

Krótka odpowiedź brzmi: methodTwo() jest nieznacznie bardziej wydajna.

methodOne() skutkuje następującym kodu bajtowego:

public int methodOne(); 
0 aload_0 [this] 
1 getfield com.example.Test.local_int_one : int [13] 
4 aload_0 [this] 
5 getfield com.example.Test.local_int_two : int [15] 
8 iadd 
9 istore_1 [total] 
10 iload_1 [total] 
11 ireturn 

A oto kod bajtowy dla methodTwo():

public int methodTwo(); 
0 aload_0 [this] 
1 getfield com.example.Test.local_int_one : int [13] 
4 aload_0 [this] 
5 getfield com.example.Test.local_int_two : int [15] 
8 iadd 
9 ireturn 

Należy jednak pamiętać, że ta optymalizacja jest zbyt drobne, a kod czytelność w tym przypadku ma znaczenie znacznie więcej niż kilka instrukcji java.

Jeśli uważasz, że zmienna tymczasowa przyczyni się do czytelności kodu, użyj jej.

+0

Prawie dwa lata później chciałbym dodać tutaj kontynuację, jeśli mogę. Ponieważ methodTwo() nie działa istore_1, oznacza to, że (w Javie) nie byłoby dodatkowego kroku gc do wykonania (ponieważ wartość jest właśnie zwracana, a nie przechowywana)? ... więc w krytycznym środowisku gc należy unikać tworzenia zmiennych w małych zakresach? – mcw

+1

@mcw, liczby całkowite nie podlegają zbędnemu oczyszczaniu ani zmiennym lokalnym. Jeśli chodzi o obiekty - są one tworzone na stos w każdym przypadku https://stackoverflow.com/a/27587519/2170192 –

Powiązane problemy