2015-10-03 27 views
5

Dati i seguenti metodi:variabili locali: Programmazione Pratiche

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

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

1) è l'unica differenza nel metodi di cui sopra leggibilità o c'è un micro-ottimizzazione "beneficio" in methodTwo()?

2) La definizione di variabili locali in un ambito ristretto deve essere evitata e se possibile evitata? (Posso vedere methodTwo diventare illeggibili se diversi calcoli devono essere eseguiti in un unico prospetto)

+0

Penso che tu abbia risposto alla tua stessa domanda. –

+2

Controllare il codice byte. (2) ha un'istruzione in meno. – EJP

+0

@EJP: cosa succede se si attivano le ottimizzazioni? Attualmente non ho accesso a un visualizzatore bytecode java. Ma evidentemente la modalità debug produce una sorta di mappatura uno-a-uno. –

risposta

5

La risposta breve è: methodTwo() è leggermente più efficiente.

methodOne() risultati nel seguente bytecode:

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 

Ed ecco il bytecode per 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 

Ma notare che questa ottimizzazione è troppo minore, e che la leggibilità del codice in questo caso conta molto di più di un paio di istruzioni java.

Se si pensa che una variabile temporanea contribuirà alla leggibilità del codice, quindi, con tutti i mezzi, utilizzarla.

+0

Quasi due anni dopo, vorrei aggiungere un seguito qui, se posso. Poiché methodTwo() non esegue istore_1, ciò significa che (in Java) non ci sarebbe alcun passaggio gc aggiuntivo da eseguire (poiché il valore è appena restituito e non memorizzato)? ... quindi in un ambiente gc-critico, l'istanziazione di variabili in ambiti ristretti dovrebbe essere evitata? – mcw

+1

@mcw, gli interi non sono soggetti alla garbage collection, né alle variabili locali. Per quanto riguarda gli oggetti, vengono comunque creati su heap https://stackoverflow.com/a/27587519/2170192 –