java - tuning - Es el operador ternario más rápido que una condición "si"
java profiler (9)
Esta pregunta ya tiene una respuesta aquí:
Soy propenso al " síndrome condicional ", lo que significa que tiendo a utilizarlo todo el tiempo. Raramente uso el operador ternario. Por ejemplo:
//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;
¿Importa cuál uso? ¿Cual es mas rápido? ¿Hay alguna diferencia de rendimiento notable? ¿Es una mejor práctica usar el código más corto siempre que sea posible?
Yo uso el lenguaje de programación Java.
¿Importa cuál uso?
¡Sí! El segundo es mucho más legible. Está negociando una línea que expresa concisamente lo que quiere contra nueve líneas de desorden efectivo.
¿Cual es mas rápido?
Ninguno.
¿Es una mejor práctica usar el código más corto siempre que sea posible?
No "siempre que sea posible", pero ciertamente siempre que sea posible sin efectos perjudiciales. El código más corto es al menos potencialmente más legible ya que se enfoca en la parte relevante más que en los efectos incidentales ("código repetitivo").
Además, el operador ternario habilita una forma de parámetro "opcional". Java no permite parámetros opcionales en las firmas de métodos, pero el operador ternario le permite alinear fácilmente una opción predeterminada cuando se proporciona null
para un valor de parámetro.
Por ejemplo:
public void myMethod(int par1, String optionalPar2) {
String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
.trim()
.toUpperCase(getDefaultLocale());
}
En el ejemplo anterior, al pasar null
como valor del parámetro String
obtiene un valor de cadena predeterminado en lugar de una NullPointerException
. Es corto y dulce y, diría, muy legible. Además, como se ha señalado, en el nivel de código de bytes realmente no hay diferencia entre el operador ternario y if-then-else. Como en el ejemplo anterior, la decisión sobre la cual elegir se basa completamente en la legibilidad.
Además, este patrón le permite hacer que el parámetro String
verdaderamente opcional (si se considera útil hacerlo) al sobrecargar el método de la siguiente manera:
public void myMethod(int par1) {
return myMethod(par1, null);
}
Ejemplo de Operador Ternario:
int a = (i == 0) ? 10 : 5;
No puedes hacer la asignación con if / else como esta:
// invalid:
int a = if (i == 0) 10; else 5;
Esta es una buena razón para usar el operador ternario. Si no tienes una tarea:
(i == 0) ? foo () : bar ();
un if / else no es mucho más código:
if (i == 0) foo (); else bar ();
En casos críticos de rendimiento: medirlo. Mídalo con la máquina objetivo, la JVM objetivo, con datos típicos, si hay un cuello de botella. De lo contrario, ve por la legibilidad.
Incrustado en contexto, la forma abreviada a veces es muy útil:
System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ());
Lo mejor es usar lo que sea que se lea mejor: en todos los efectos prácticos hay una diferencia entre el rendimiento.
En este caso, creo que la última afirmación es mejor que la primera afirmación if, pero hay que tener cuidado de no abusar del operador ternario; a veces puede hacer las cosas mucho menos claras.
Los operadores ternarios son solo taquigrafía. Compilan en la declaración equivalente if-else
, lo que significa que serán exactamente lo mismo.
Para el ejemplo dado, prefiero el operador ternario o de condición ( ?
) Por una razón específica: puedo ver claramente que asignar a
no es opcional. Con un ejemplo simple, no es demasiado difícil escanear el bloque if-else para ver que a
se asigna en cada cláusula, pero imagine varias asignaciones en cada cláusula:
if (i == 0)
{
a = 10;
b = 6;
c = 3;
}
else
{
a = 5;
b = 4;
d = 1;
}
a = (i == 0) ? 10 : 5;
b = (i == 0) ? 6 : 4;
c = (i == 0) ? 3 : 9;
d = (i == 0) ? 12 : 1;
Prefiero lo último para que sepas que no te has perdido una tarea.
Sí, es importante, pero no por el rendimiento de ejecución del código.
La codificación más rápida (rendimiento) es más relevante para el bucle y la instanciación de objetos que las construcciones simples de sintaxis. El compilador debe manejar la optimización (¡todo va a ser sobre el mismo binario!), Por lo que su objetivo debe ser la eficiencia para Usted-Del-Futuro (los humanos siempre son el cuello de botella en el software).
La "Ansiedad de rendimiento" de Josh Bloch habla en Parleys.com
La respuesta que cita 9 líneas versus una puede ser engañosa: menos líneas de código no siempre son mejores. Los operadores ternarios pueden ser una forma más concisa en situaciones limitadas (su ejemplo es bueno).
PERO a menudo pueden ser objeto de abuso para que el código sea ilegible (lo cual es un pecado capital) = ¡no aniden los operadores ternarios!
También considere la posibilidad de mantenimiento futuro, if-else es mucho más fácil de extender o modificar:
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
ps respuesta de muy completa en To ternary or not to ternary?
Si hay alguna diferencia de rendimiento (que dudo), será insignificante. Concéntrese en escribir el código más simple y más legible que pueda.
Una vez dicho esto, trate de superar su aversión hacia el operador condicional, aunque es posible abusar de él, puede ser realmente útil en algunos casos. En el ejemplo específico que diste, definitivamente usaría el operador condicional.
intente usar la declaración del switch case
. pero normalmente no es el cuello de botella prefermance.