2012-03-06 6 views
11

Entro java mi chiedo quale di questi è più efficiente:due istruzioni IF contro una AND dichiarazione

if(something) 
    { 
     if(something) 
    } 

o

if((something) &&(something)) 

Mi chiedevo che cosa i meriti sono per entrambi in termini di prestazioni . Quali soluzioni si prestano meglio a diversi oggetti di dati.

+1

il primo modo in cui si osserva tipicamente in codice scritto da persone che non sanno/capire che l'operatore '&&' cortocircuiti. Ho visto 15+ blocchi 'if' in cascata nel codice precedente e li ho prontamente sostituiti tutti con il secondo modo. (A parte: VB.NET 'And' è uno di questi esempi dove non cortocircuito, ma' AndAlso' fa) – Seph

risposta

19

Le prestazioni saranno identiche. La prima affermazione verrà valutata e solo se è vera verrà valutata la seconda.

Questa è solo una questione di leggibilità. A meno che non ci sia qualcosa che deve essere fatto se la prima affermazione è vera, indipendentemente dal secondo, io andrei con entrambi nella stessa linea in quanto è più chiaro che entrambe le affermazioni devono essere vere perché qualcosa possa accadere. Inoltre non è necessario rientrare inutilmente.

+2

+1: il byte code nel caso più semplice è identico –

+0

Penso che due "se" affermazioni è migliore per la leggibilità se alcune condizioni vengono controllate utilizzando più operazioni booleane e ci sono più condizioni. Ad esempio, per verificare se "num è una potenza di 2" e "la dimensione è positiva", penso che sarebbe più difficile leggere se si scrive (python) "se num> 0 e num & (num-1) == 0 e dimensione == 0: ... " – Sean

2

In Java, && cortocircuiti. Ciò significa che se la prima condizione in a && b viene valutata su false, la seconda condizione non viene nemmeno valutata.

Pertanto, i due risultati quasi certamente in codice identico e non c'è alcuna differenza di prestazioni.

Dei due moduli, è necessario utilizzare qualsiasi risultato in un codice più chiaro.

2

In generale sono uguali. Se il primo viene valutato falso, il secondo non verrà valutato. Nel caso in cui desideri che qualcosa accada se il primo è falso, dovresti usare l'if-statement separata. Altrimenti, se vuoi essere sicuro che entrambi siano vere e non fare nulla se uno di questi restituisce false, puoi usare la seconda opzione.

1

Si noti che l'operatore && in Java è un operatore di cortocircuito. Ciò significa che se l'espressione sul lato sinistro di && è false, Java non si preoccuperà di valutare l'espressione sul lato destro, perché il risultato sarà false, indipendentemente dall'espressione del lato destro da valutare .

Quindi, in modo efficace, le prestazioni di queste due costruzioni saranno le stesse.

Si noti che Java ha anche un operatore &. Quello non è un corto circuito: valuterà sempre le espressioni su entrambi i lati dello &.

0

Non lo so, ma, per intuizione, credo che una volta compilato in bytecode non c'è differenza ...

Problemi correlati