¿Podría explicarme brevemente que comprenda esto?¿Hay alguna diferencia de rendimiento entre el uso de int a = a + 1 y a ++ en java? Si es así, ¿qué es mejor y por qué?
Respuesta
Mirando el código de bytes generada:
public static void main(String[] args) {
int x = 1;
int y = 1;
int z = 1;
int a = 1;
int b = 1;
x = x + 1;
y++;
++z;
a += 1;
b += 2;
}
genera (uso javap -c classname
)
0: iconst_1
1: istore_1
2: iconst_1
3: istore_2
4: iconst_1
5: istore_3
6: iconst_1
7: istore 4
9: iconst_1
10: istore 5
12: iload_1
13: iconst_1
14: iadd
15: istore_1
16: iinc 2, 1
19: iinc 3, 1
22: iinc 4, 1
25: iinc 5, 2
28: return
Así, utilizando (jdk1.6.0 _18):
x = x + 1
crea
12: iload_1
13: iconst_1
14: iadd
15: istore_1
mientras que
y++;
++z;
a += 1;
todo el resultado en
iinc
Sin embargo, hacer una prueba de rendimiento bruto en mi portátil dio lugar al lado de ninguna diferencia en el tiempo de ejecución entre los dos (a veces ++ x era más rápido, a veces x = x + 1 fue más rápido), así que no me preocuparía por las implicaciones de rendimiento.
¡Y la lección que debe aprender de esto es que no puede inferir el rendimiento de Java contando códigos de byte! (Ni siquiera si ejecuta 'java -int ...' para activar la compilación de JIT). –
No, no habrá ninguna diferencia notable. Use lo que encuentre más legible (que es a++
, normalmente).
Primera regla de optimización de código: no.
downvoter: ¿me importa explicar tu voto? –
No he votado negativamente, pero en realidad no estoy de acuerdo con su punto. Desde una perspectiva de código limpio 'a + = 1' es, al menos desde mi perspectiva, un enfoque más sólido tanto para la legibilidad como para la tolerancia a fallas. ¿Alguna vez evaluaste 'a +++ b' (en Java y C++)? El único argumento para a ++ fue la instrucción del procesador diferente, pero esto es ahora optimizado por JVM. – fyr
no estamos discutiendo a +++ b aquí. Estamos discutiendo un ++, que es la instrucción que significa "* incrementar un *". Es legible por cualquier desarrollador de Java, y no hay ningún problema de comprensión con esta instrucción. –
a ++ es mucho más rápido. Se convierte en el comando INC de ensamblador. Pero creo que JVM optimizará a = a + 1, por lo que no es necesario preocuparse por eso.
que es lo mismo, y hoy en día con la optimización del compilador no debería estar al tanto de esas cosas, para aumentar su control del funcionamiento de otros asuntos más importantes como allocs :)
El compilador debe optimizar y no debe haber ninguna diferencia en absoluto. Pero hay que tener en cuenta que operador de incremento prefijo puede haber (que depende por el compilador) más rápido que el equivalente de sufijo (en C++ y C# también):
++a
más rápido que a++
debido a que el operador de sufijo debe crear una variable temporal .. pensar en su aplicación:
prefijo:
a = a + 1;
return a;
postfix:
int tmp = a;
a = a + 1;
return tmp;
nop: http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c – assylias
como dije: ** puede ser **. no todos los compiladores optimizan de esta manera. – vulkanino
@vulkanino: debe leer para usted: http://stackoverflow.com/questions/4638364/undefined-behavior-and-sequence-points-reloaded – fyr
En primer lugar, la Especificación del lenguaje Java no dice nada sobre el tiempo. Pero suponiendo que estamos utilizando un compilador típica como Soles javac vemos que todos los ejemplos anteriores (a++
, ++a
, a += 1
, a = a + 1
), o bien podría ser compilado en algo así como:
iinc
instrucción, trabajando en variables:iload_<variable> iinc <variable>, 1 istore_<variable>
iadd
instuction, usando la pantalla (en este caso mediante la variable1
como el almacenamiento):iload_1 iconst_1 iadd istore_1
Depende del compilador elegir la mejor manera posible de compilarlos. P.ej. hay ninguna diferencia entre ellos. Y no debería haber ninguna diferencia entre las declaraciones, todas expresan lo mismo, sumar una a un número.
Eso beeing dijo, tanto el iinc
y la versión iadd
puede ser compilado usando el JIT a algo rápido y dependiente de la plataforma, y al final me podría suponer que un tiempo de ejecución normal, compila las dos versiones en el mismo código ensamblador.
Con mi compilador, * * jdk1.6.0_20 los métodos de "incremento", incluso utiliza la misma instrucción.
public class Test {
public static void main(String[] args) {
int a = 0;
a = a + 1;
a += 1;
a++;
++a;
}
}
Este es el desmontaje:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iinc 1, 1 // a = a + 1;
5: iinc 1, 1 // a += 1;
8: iinc 1, 1 // a++;
11: iinc 1, 1 // ++a;
14: return
}
¿Puede usted pls. agregar detalles para '++ a' también? – Azodious
@Azodious: Depende del caso, si solo agrego '++ a;' a las declaraciones anteriores, simplemente lo convertirá en otro 'iinc 1, 1'. Sin embargo, en un escenario más complejo, el orden de las instrucciones será diferente (vea esto [SO post] (http://stackoverflow.com/questions/5413548/java-prefix-postfix-of-increment-decrement-operators-need- ayuda-con-ejemplo)). – dacwe
Creo que en "iinc instruction, trabajando en variables" hay un error. 'iinc' no necesita' iload' y 'istore' (?) – Johannes
- 1. ¿Hay alguna diferencia entre int & a y int & a?
- 2. ¿Existe alguna diferencia en el uso de INT (1) frente a TININT (1) en MySQL?
- 3. ¿Por qué es -1> sizeof (int)?
- 4. ¿Por qué ENUM es mejor que INT
- 5. En Javascript, ¿por qué [1, 2] == [1, 2] o ({a: 1}) == ({a: 1}) es falso?
- 6. ¿Alguna vez el rendimiento es diferente entre Java >> y >>> operadores de desplazamiento a la derecha?
- 7. ¿Hay alguna diferencia (de rendimiento) entre Depurar y Liberar?
- 8. ¿Qué es mejor en términos de rendimiento?
- 9. ¿Cuál es la diferencia entre 1 y '1 en Lisp?
- 10. ¿Por qué el uso es mejor que el uso?
- 11. ¿Cuál es la diferencia entre a [:] = b y a = b [:]
- 12. ¿Cuál es la diferencia entre double a = a + int b e int a + = double b?
- 13. ¿Cuál es la diferencia entre 'int'? y 'int' en C#?
- 14. ¿Cuál es la diferencia entre $ a y $$ a en php?
- 15. ¿Por qué el tipo "int" nunca es igual a "nulo"?
- 16. ¿Hay alguna diferencia entre gluLookAt() y glFrustum()?
- 17. ¿Hay alguna diferencia de rendimiento entre myCollection.Where (...). FirstOrDefault() y myCollection.FirstOrDefault (...)
- 18. ¿Hay alguna diferencia entre System.Windows.Clipboard y System.Windows.Forms.Clipboard?
- 19. ¿Por qué el resultado 2 + 1 y 0 es 0?
- 20. ¿Cuál es la diferencia de rendimiento entre HttpModule y Global.aspx?
- 21. En C, ¿por qué sizeof (char) 1, cuando 'a' es un int?
- 22. En Javascript, ¿por qué {a: 1} == {a: 1} da un error, y ({a: 1}) == {a: 1} funcionará?
- 23. ¿Por qué un [:] = 1 es fundamentalmente diferente de un [:] = '1'?
- 24. Jit: Cambiar el tamaño de JitTable de 512 a 1024 y así sucesivamente .... ¿qué es esto?
- 25. ¿Se prefiere XAMPP (para Windows) a WampServer? Si es así, ¿por qué?
- 26. Diferencia de rendimiento entre IIf() y Si
- 27. Casting (int?) Null vs. new int?() - ¿Qué es mejor?
- 28. ¿Es esto un cierre? Si es así, ¿por qué?
- 29. ¿Qué es el/elemento? ¿Como lo uso? ¿Y por qué?
- 30. ¿Has escrito funciones muy largas? Si es así, ¿por qué?
Esto va a ser bueno. – Mob
concidering micro-optimizations: siempre haga lo que sea más legible, permita que el compilador optimice para usted. El código es para programadores, las optimizaciones son para compiladores. – amit
al hacer esta pregunta le costará más tiempo que la ventaja en tiempo de ejecución de la solución más rápida (si hay alguna). –