2012-11-29 19 views
7

Sto lavorando per migliorare le prestazioni di un programma Java. Dopo aver migliorato il data structures e la complessità dell'algoritmo, sto provando a migliorare l'implementazione. Voglio sapere se è veramente importante sapere come utilizzare l'istruzione if in condizione.`if` condition efficiency

Il compilatore considera queste due versioni uguali? Costano lo stesso (se ho molte più variabili all'interno della dichiarazione if)?

if(a && b && c && d && e && f && g) 

O

if(a) 
if(b) 
    if(c) 
    if(d) 
    if(e) 
    if(f) 
     if(g) 

(In questo specifico progetto non mi importa di leggibilità, so che il secondo è meno leggibile)

+1

Anche prima di arrivare alla questione ottimizzazione del compilatore, la seconda versione è decisamente meno leggibile. – adarshr

+0

Hai ragione, ma in questo specifico progetto mi interessa meno la leggibilità, voglio solo usare l'implementazione più efficiente poiché è estremamente critica per me in questo caso. – Maroun

+0

Guarda [risposta] (http://stackoverflow.com/questions/13621324/are-variable-definitions-that-are-used-once-optimized/13621403#13621403). Può essere trasferito nel tuo caso. – jlordo

risposta

22

L'operatore && (e anche ||) è un operatore di cortocircuito in Java.

Ciò significa che se a è false, Java non valuta b, c, d ecc, perché conosce già l'intera espressione a && b && c && d && e && f && g sta per essere false.

Quindi non c'è niente da guadagnare per scrivere il tuo if come una serie di istruzioni nidificate if.

L'unico buon modo per ottimizzare le prestazioni è misurare le prestazioni di un programma utilizzando un profiler, determinare dove si trova il collo di bottiglia delle prestazioni effettive e provare a migliorare quella parte del codice. L'ottimizzazione mediante l'analisi di codice e ipotesi, e l'applicazione di micro-ottimizzazioni, di solito non è un modo efficace di ottimizzazione.

+0

Intendevi '||'? Perché se 'a' è' true' Java continua a valutare 'a && b && c&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&= Se 'a' è' false' allora sa 'a && b && c && d && e && f && g1' sarà falso. –

+0

@TheCat Modificato. – Jesper

6

Quando si profila un programma scritto in qualsiasi lingua, non concentrarsi sulle strutture linguistiche, ma concentrarsi su ciò che sta facendo il codice. Tempo il tuo codice, scopri dove viene speso il tempo, quindi saprai qual è la causa perché sarebbe stata ridotta.

Se sai che le parti lente del tuo programma sono nella tua istruzione if, allora sai già la risposta alla tua domanda.

Sto postando questa risposta come risposta perché ritengo che chiedere l'efficienza di una particolare funzionalità linguistica ai fini dell'ottimizzazione sia del tutto sbagliato, e credo che trarrai vantaggio da una strategia molto diversa.

Inoltre, alcune implementazioni possono gestire le cose in modo un po 'diverso, quindi a meno che qualcosa non sia impostato su uno standard (e talvolta, anche QUELLO non è una garanzia), la risposta potrebbe essere dipendente dall'implementazione e condizionale.

10

In aggiunta alle altre risposte, anche su un livello molto basso non v'è alcuna differenza tra i due approcci - che vengono compilati nello stesso bytecode:

boolean a=true, b=true, c=true, d=true, e=true, f=true, g=true; 
    0: iconst_1 
    1: istore_1 
    2: iconst_1 
    3: istore_2 
    4: iconst_1 
    5: istore_3 
    6: iconst_1 
    7: istore  4 
    9: iconst_1 
    10: istore  5 
    12: iconst_1 
    13: istore  6 
    15: iconst_1 
    16: istore  7 

if(a && b && c && d && e && f && g) {} 
    18: iload_1 
    19: ifeq   45 
    22: iload_2 
    23: ifeq   45 
    26: iload_3 
    27: ifeq   45 
    30: iload   4 
    32: ifeq   45 
    35: iload   5 
    37: ifeq   45 
    40: iload   6 
    42: ifeq   45 

if(a) if(b) if(c) if(d) if(e) if(f) if(g) {} 
    45: iload_1 
    46: ifeq   72 
    49: iload_2 
    50: ifeq   72 
    53: iload_3 
    54: ifeq   72 
    57: iload   4 
    59: ifeq   72 
    62: iload   5 
    64: ifeq   72 
    67: iload   6 
    69: ifeq   72