C'è solo un tipo di istruzione "se" lì. L'altro è un'espressione condizionale. Per quanto riguarda il rendimento migliore: potrebbero compilare lo stesso bytecode, e mi aspetterei che si comportino in modo identico, o così vicino da non voler scegliere l'uno sull'altro in termini di prestazioni.
A volte una dichiarazione if
sarà più leggibile, a volte l'operatore condizionale sarà più leggibile. In particolare, consiglierei di utilizzare l'operatore condizionale quando i due operandi sono semplici e senza effetti collaterali, mentre se lo scopo principale dei due rami è i loro effetti collaterali, probabilmente utilizzerei una dichiarazione if
.
Ecco un esempio di programma e bytecode:
public class Test {
public static void main(String[] args) {
int x;
if (args.length > 0) {
x = 1;
} else {
x = 2;
}
}
public static void main2(String[] args) {
int x = (args.length > 0) ? 1 : 2;
}
}
Bytecode decompilato con javap -c Test
:
public class Test extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]
Code:
0: aload_0
1: arraylength
2: ifle 10
5: iconst_1
6: istore_1
7: goto 12
10: iconst_2
11: istore_1
12: return
public static void main2(java.lang.String[
Code:
0: aload_0
1: arraylength
2: ifle 9
5: iconst_1
6: goto 10
9: iconst_2
10: istore_1
11: return
}
Come si può vedere, c'è una leggera differenza in bytecode qui - se si verifica l'istore_1
all'interno della brance o meno (a differenza del mio precedente tentativo estremamente viziato :) ma sarei molto sorpreso se il JITter finisse con un diverso codice nativo.
fonte
2011-01-16 17:02:11
Immagino che non ci sia assolutamente alcuna differenza. È solo sintassi. A meno che i compilatori non siano un po 'cattivi (o qualcos'altro) e io abbia sbagliato – sinelaw
Hai (micro) fatto un benchmark? Condividi i risultati. – BalusC
Entrambe diventeranno jit'ed. Non ci sarà alcuna differenza. E non preoccuparti di decompilare la roba.La prima cosa che fa HotSpot è eliminare ** tutte ** le ottimizzazioni applicate da javac. –