Il n'y a qu'un seul type d'instruction "si". L'autre est une expression conditionnelle. Quant à savoir laquelle sera la plus performante : elles pourraient être compilées dans le même bytecode, et je m'attendrais à ce qu'elles se comportent de manière identique - ou si proche que vous ne voudriez certainement pas choisir l'une plutôt que l'autre en termes de performances.
Parfois, un if
sera plus lisible, parfois l'opérateur conditionnel sera plus lisible. En particulier, je recommanderais d'utiliser l'opérateur conditionnel lorsque les deux opérandes sont simples et sans effet secondaire, alors que si le but principal des deux branches est leurs effets secondaires, j'utiliserais probablement un if
déclaration.
Voici un exemple de programme et de 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 décompilé avec 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
}
Comme vous pouvez le voir, il y a un léger différence dans le bytecode ici - si le istore_1
se produit à l'intérieur de la brance ou non (contrairement à ma tentative précédente très défectueuse :) mais je serais très surpris que le JITter aboutisse à un code natif différent.
34 votes
Je suppose qu'il n'y a absolument aucune différence. C'est juste de la syntaxe. A moins que les compilateurs soient quelque peu diaboliques (ou autre chose) et que je me trompe.
4 votes
L'avez-vous (micro)benchmarké ? Partagez les résultats.
3 votes
Les deux se retrouveront en prison. Il n'y aura pas de différence du tout. Et ne vous embêtez pas à décompiler le truc. La première chose que fait HotSpot est d'enlever tous les optimisations qui ont été appliquées par javac.
0 votes
Il est mieux de comparer le bytecode de bas niveau.
0 votes
La seule chose que vous pouvez dire sur le code d'octet est s'il est le même.
1 votes
Je suggère
int x=1; if (!expression) x++;
- Non, encore mieux, arrêter micro-optimisations.12 votes
Ils n'existent pas pour des vitesses différentes. Ils existent pour des raisons différentes. Je suis sûr que vous comprenez la différence entre les déclarations et les expressions. Les déclarations exécutent des actions. Les expressions produisent des valeurs.
if
est destiné à être utilisé dans les déclarations.?
est destiné à être utilisé dans les expressions.1 votes
@schnaader tout le monde sait que ++x ; est plus rapide que x++ :P De plus, ce code serait en fait plus lent car il implique (lorsque l'expression est fausse) 2 écritures, un saut conditionnel et une lecture -- Par rapport au code original où il y avait un saut conditionnel, une écriture et un saut constant.
3 votes
+1 car les réponses à cette question valent la peine d'être lues, même si l'intention de la question initiale est malencontreuse.
2 votes
@James : Tu as raison. Donc, leçon apprise : arrêter micro-optimisation :) Cela ne changera rien ou même empirera les choses.
2 votes
@finnw - Les downvotes proviennent probablement de développeurs qui sont las des questions de micro-optimisation. Essentiellement, elles reviennent à pontifier sur des choses qui n'ont aucune valeur réelle dans le monde réel.
0 votes
Si vous lisez ceci, ne manquez pas le commentaire de James