Tengo un fragmento de código Java sencilla:
public static void main(String[] args) {
String testStr = "test";
String rst = testStr + 1 + "a" + "pig" + 2;
System.out.println(rst);
}
Compilar con el compilador Java Eclipse, y examinar el código de bytes usando AsmTools. Muestra:
Hay tres variables locales en el método. El argumento es en la ranura 0, y las ranuras 1 y 2 son supuestamente utilizado por el código. Pero creo que 2 variables locales son justo lo suficiente - el índice 0 es el argumento de todos modos, y el código sólo necesita una variable más.
Con el fin de ver si mi idea es correcta, he editado el código de bytes textual, redujo el número de variables locales a 2, y ajusté algunas instrucciones relacionadas:
Me recompilado con AsmTools y funciona bien!
Así que ¿por qué no javac o el compilador Eclipse hacen este tipo de optimización de utilizar las variables locales mínimos?
Simplemente porque Java mejoras en el rendimiento del compilador justo a tiempo.
Lo que se hace en la fuente de Java, e incluso lo que aparece en los archivos de clase no es lo que permite aumentar el rendimiento en tiempo de ejecución. Por supuesto, no se debe descuidar esa parte, pero sólo en el sentido de evitar hacer "estúpida" aquí.
Significado: la JVM en tiempo de ejecución decide si un método vale traduzca en (altamente optimizado!) Código de máquina. Si la JVM decide "no vale la pena de optimización", ¿por qué hacer javac más complejo y más lento por tener una gran cantidad de optimización de ahí? Más: cuanto más simple y básica el código de bytes de entrada, más fácil es para el JIT para analizar y mejorar esa entrada!