java - ¿Qué construcción "si" es más rápida-declaración o operador ternario?
performance if-statement (5)
Es probable que ambos ejemplos se compilen en un bytecode idéntico o casi idéntico, por lo que no debería haber diferencia en el rendimiento.
Si hubiera habido una diferencia en la velocidad de ejecución, aún debería usar la versión más idiomática (que sería la segunda para asignar una sola variable basada en una condición simple y dos subexpresiones simples, y la primera para realizar operaciones más complejas o operaciones que no caben en una sola línea).
Hay dos tipos de sentencias if
en java - classic: if {} else {}
y taquigrafía: exp ? value1 : value2
exp ? value1 : value2
. ¿Es uno más rápido que el otro o son iguales?
declaración:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
operador ternario:
int x = (expression) ? 1 : 2;
Estos son lo mismo. Ambos son bastante rápidos, típicamente alrededor de 10-30 nano segundos. (según el patrón de uso) ¿Es este marco de tiempo importante para usted?
Debes hacer lo que creas que es más claro.
Solo hay un tipo de declaración "si" allí. La otra es una expresión condicional. En cuanto a cuál funcionará mejor: podrían compilar al mismo código de bytes, y esperaría que se comporten de manera idéntica, o tan cerca que definitivamente no querría elegir uno sobre el otro en términos de rendimiento.
A veces, una sentencia if
será más legible, a veces el operador condicional será más legible. En particular, recomendaría usar el operador condicional cuando los dos operandos son simples y libres de efectos secundarios, mientras que si el propósito principal de las dos ramas son sus efectos secundarios, probablemente usaría una instrucción if
.
Aquí hay un programa de muestra y un 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 descompilado con 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
}
Como puede ver, hay una pequeña diferencia en bytecode aquí - si el istore_1
ocurre dentro del brance o no (a diferencia de mi intento anterior muy defectuoso :) pero me sorprendería mucho si el JITter terminara con un código nativo diferente.
Solo para agregar a todas las demás respuestas:
La segunda expresión a menudo se llama operador / declaración terciaria / ternaria. Puede ser muy útil porque devuelve una expresión. Algunas veces hace que el código sea más claro para declaraciones cortas típicas.
tampoco - serán compilados al mismo.