2012-07-25 59 views
29

Duplicar posibles:
Is the conditional operator slow?Ternario? operador contra el operador convencional Si-else en C#

yo soy un usuario masiva del operador ? en C#. Sin embargo, mi gerente de proyecto frecuentemente me advierte que usar el operador ? puede costar cierto rendimiento en comparación con las declaraciones If-Else en una aplicación a gran escala. Entonces me dicen que evite usarlo. Sin embargo, me encanta usarlo porque es conciso y mantiene el código limpio.

¿Existe tal sobrecarga de rendimiento cuando se utiliza el operador ??

+0

Puede obtener buenas respuestas aquí ... en este http://stackoverflow.com/questions/3312786/benefits-of-using-the-conditional-ternary-operator –

+0

Por favor, considere leer este hilo también: http : //stackoverflow.com/questions/2259741/is-the-conditional-operator-slow. En mi humilde opinión, su gerente es equívoco –

+0

No creo que las otras preguntas vinculadas aborden la supuesta sobrecarga del rendimiento (que no puedo ver de dónde vendría). – Thilo

Respuesta

68

Ejecuté 100 millones de operadores ternarios y 100 millones de declaraciones If-Else y registré el rendimiento de cada uno. Aquí está el código:

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(); 

Aquí están los resultados (se ejecutó en un Intel Atom 1.66GHz con 1 GB de RAM y sé, que es una mierda):

  • operador ternario: 5986 milisegundos o 0.00000005986 segundos por cada operador.

  • If-Else: 5667 milisegundos o 0.00000005667 segundos por cada extracto.

No olvide que me encontré con 100 millones de ellos, y no creo que la diferencia 0.00000000319 segundos entre los dos asuntos que mucho.

+12

+1 para esas estadísticas. –

+1

¡Me encanta que hayas hecho esto! –

19

Utilice lo que hace que su código sea legible. Si las declaraciones if hacen eso, úselos. Si los operadores ternarios hacen eso, úselos.

Es probable que ambos compilen hasta el mismo IL de todos modos.

En cualquier caso, las cosas que ralentizarán su aplicación probablemente serán la base de datos o la red o el disco duro ... cualquier cosa excepto si usó declaraciones if o expresiones ternarias.

2

Desde mi punto de vista personal, no veo ninguna diferencia de rendimiento entre el operador ternario y la instrucción if. Muchos lenguajes de programación lo admiten y el operador de tenary es más amigable para desarrolladores cuando el operador convencional If-else es comprensible de manera general .

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

10

No hay razón para esperar que cualquier diferencia en el rendimiento.

En mi opinión, el operador ternario solo debe usarse si los tres operandos son muy concisos y fáciles de leer. De lo contrario, creo que tiene el potencial de hacer que el código sea más difícil de leer.

Creo que mucha gente usa mal este operador al atascar demasiada lógica en una larga línea de código. Personalmente no lo usaré a menos que toda la línea tenga menos de 80 caracteres.

Buenas:

return isFunky ? funkyValue : null;

malo:

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

He visto a gente hacer mucho peor que el anterior. ¡Creo que deberían perder sus privilegios ternarios!

5

Es muy difícil leer operaciones ternarias. Si usa condiciones anidadas, entender ternary se convertirá en una sobrecarga. Intenta evitar el ternario si hay más condiciones.