web-dev-qa-db-fra.com

Ternaire? opérateur vs l'opérateur If-else conventionnel en c #

Duplicata possible:
L'opérateur conditionnel est-il lent?

Je suis un grand utilisateur du ? opérateur en C #. Cependant, mon chef de projet m'avertit fréquemment que l'utilisation de ? L'opérateur peut coûter des performances par rapport à If-Else instructions dans une application à grande échelle. On me dit donc d'éviter de l'utiliser. Cependant, j'adore l'utiliser car il est concis et permet de garder le code propre.

Y a-t-il une telle surcharge de performances lors de l'utilisation de ? opérateur?

39
Paras

J'ai géré 100 millions d'opérateurs ternaires et 100 millions de relevés If-Else et enregistré la performance de chacun. Voici le code:

Stopwatch s = new Stopwatch();
// System.Diagnostics Stopwatch
int test = 0;
s.Start();
for(int a = 0; a < 100000000; a++)
    test = a % 50 == 0 ? 1 : 2;
s.Stop();

s.Restart();
for(int b = 0; b < 100000000; b++)
{
    if(b % 50 == 0)
        test = 1;
    else
        test = 2; 
}
s.Stop();

Voici les résultats (exécuté sur un Intel Atom 1,66 GHz avec 1 Go de RAM et je sais, ça craint):

  • Opérateur ternaire: 5986 millisecondes ou 0,00000005986 seconde pour chaque opérateur.

  • If-Else: 5667 millisecondes ou 0,00000005667 secondes pour chaque instruction.

N'oubliez pas que j'en ai exécuté 100 millions, et je ne pense pas que la différence de 0,0000000000319 seconde entre les deux soit importante.

109
matthewr

Non.

Utilisez ce qui rend votre code lisible. Si les instructions if font cela, utilisez-les. Si les opérateurs ternaires font cela, utilisez-les.

Il est probable que les deux se compileront dans le même IL de toute façon.

Dans tous les cas, les choses qui ralentiront votre application seront probablement la base de données ou le réseau ou le disque dur ... tout sauf si vous avez utilisé des instructions if ou des expressions ternaires.

22
Anthony Mills

Il n'y a aucune raison de s'attendre à une différence de performances.

À mon avis, l'opérateur ternaire ne devrait être utilisé que si les trois opérandes sont très concis et faciles à lire. Sinon, je pense qu'il a le potentiel de rendre le code plus difficile à lire.

Je pense que beaucoup de gens utilisent mal cet opérateur en brouillant trop de logique dans une longue ligne de code. Personnellement, je ne l'utilise que si la ligne entière est inférieure à environ 80 caractères.

Bien:

return isFunky ? funkyValue : null;

Mauvais:

return (thisThing == thatThing && (anotherThing != null || ! IsThisTrue())) ? someThing.GetThis().GetThat() : yetAnotherThing.GetBlah().GetFoo();

J'ai vu des gens faire bien pire que ce qui précède. Je pense qu'ils devraient perdre leurs privilèges ternaires!

17
jahroy

Il est très difficile de lire les opérations ternaires. Si vous utilisez des conditions imbriquées, la compréhension du ternaire deviendra une surcharge. Essayez d'éviter le ternaire s'il y a plus de conditions.

8
user1920811

De mon point de vue personnel, je ne vois aucune différence de performances entre l'opérateur ternaire et l'instruction if. De nombreux langages de programmation le prennent en charge et l'opérateur tenary est plus convivial pour les développeurs alors que l'opérateur If-else conventionnel est compréhensible de manière générale.

http://en.wikipedia.org/wiki/%3F%3a

3
mesimplybj