119 votes

L'opérateur ternaire est-il plus rapide qu'une condition "if" en Java ?

Je suis enclin à " syndrome du "si" conditionnel "Ce qui signifie que j'ai tendance à utiliser les conditions if tout le temps. J'utilise rarement l'opérateur ternaire. Par exemple :

//I like to do this:
int a;
if (i == 0)
{
    a = 10;
}
else
{
    a = 5;
}

//When I could do this:
int a = (i == 0) ? 10:5;

Est-ce important de savoir lequel j'utilise ? Lequel est le plus rapide ? Y a-t-il des différences de performances notables ? Est-il préférable d'utiliser le code le plus court lorsque cela est possible ?

4 votes

Cela n'a pas d'importance et vous devriez plutôt vous préoccuper de la propreté du code que des performances. Dans ce cas, je pense que l'opérateur ternaire est simplement plus propre.

3 votes

Aussi, vous pouvez le faire comme ceci if(i == 0) a = 10; else a = 5;

17 votes

L'optimisation prématurée sans profilage montrant un besoin précis est mauvaise, mauvaise, mauvaise. Utilisez le code que votre futur moi comprendra le mieux dans 6 mois.

110voto

Konrad Rudolph Points 231505

Est-ce que ça importe de savoir lequel j'utilise ?

Oui ! La seconde est beaucoup plus lisible. Vous échangez une ligne qui exprime de manière concise ce que vous voulez contre neuf lignes qui sont effectivement encombrantes.

Lequel est le plus rapide ?

Ni l'un ni l'autre.

Est-il préférable d'utiliser le code le plus court lorsque cela est possible ?

Pas "chaque fois que possible", mais certainement chaque fois que possible sans effets néfastes. Un code plus court est au moins potentiellement plus lisible car il se concentre sur la partie pertinente plutôt que sur les effets accessoires ("code passe-partout").

32voto

Jon Skeet Points 692016

S'il y a tout de performance (ce dont je doute), elle sera négligeable. Concentrez-vous sur l'écriture du code le plus simple et le plus lisible possible.

Cela dit, essayez de surmonter votre aversion pour l'opérateur conditionnel - bien qu'il soit certainement possible d'en abuser, il peut être vraiment utile dans certains cas. Dans l'exemple spécifique que vous avez donné, j'utiliserais certainement l'opérateur conditionnel.

1 votes

Pourquoi utiliseriez-vous le conditionnel ici ? J'utiliserais le ternaire pour la propreté.

17 votes

@Jon : L'opérateur conditionnel est l'actuelle nom pour ce que vous avez appelé l'opérateur ternaire. C'est a opérateur ternaire, car il possède 3 opérandes, mais son nom est l'opérateur conditionnel.

2 votes

Ok, merci pour la clarification. Je pensais que vous vouliez dire l'explicite if-else la syntaxe.

29voto

user unknown Points 15555

Exemple d'opérateur ternaire :

int a = (i == 0) ? 10 : 5;

Vous ne pouvez pas faire d'affectation avec if/else comme ça :

// invalid:
int a = if (i == 0) 10; else 5;

C'est une bonne raison d'utiliser l'opérateur ternaire. Si vous n'avez pas d'affectation :

(i == 0) ? foo () : bar ();

un if/else n'est pas beaucoup plus de code :

if (i == 0) foo (); else bar ();

Dans les cas où les performances sont critiques : mesurez-les. Mesurez-la avec la machine cible, la JVM cible, avec des données typiques, s'il y a un goulot d'étranglement. Sinon, privilégiez la lisibilité.

Intégrée dans le contexte, la forme courte est parfois très pratique :

System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ());

14voto

foupfeiffer Points 121

Oui, c'est important, mais pas en raison des performances d'exécution du code.

Un codage plus rapide (performant) est plus pertinent pour les boucles et l'instanciation d'objets que les simples constructions syntaxiques. Le compilateur devrait s'occuper de l'optimisation (il s'agit du même binaire !) et votre objectif devrait être l'efficacité pour Vous-du-Futur (les humains sont toujours le goulot d'étranglement dans les logiciels).

La réponse citant 9 lignes contre une peut être trompeuse : moins de lignes de code n'est pas toujours synonyme de meilleur. Les opérateurs ternaires peuvent être un moyen plus concis dans des situations limitées (votre exemple en est un bon).

MAIS on peut souvent en abuser pour rendre le code illisible (ce qui est un péché capital) = ne pas imbriquer les opérateurs ternaires !

Pensez également à la maintenabilité future, if-else est beaucoup plus facile à étendre ou à modifier :

int a;
if ( i != 0 && k == 7 ){
    a = 10;
    logger.debug( "debug message here" );
}else
    a = 3;
    logger.debug( "other debug message here" );
}

int a = (i != 0 && k== 7 ) ? 10 : 3;  // density without logging nor ability to use breakpoints

p.s. réponse très complète de StackOverflow à l'adresse suivante Ternir ou ne pas ternir ?

8voto

Jon Points 4637

Les opérateurs ternaires ne sont que des raccourcis. Ils se compilent dans l'équivalent if-else ce qui signifie qu'ils seront exactement la même chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X