El compilador estándar de Java hace algunas optimizaciones, pero deja la mayoría de ellas al JIT.
El JIT sabe en qué procesador se está ejecutando exactamente el programa y también tiene acceso a la información de tiempo de ejecución, y por lo tanto puede hacer más optimizaciones de las que el compilador de Java podría hacer de antemano. Además, hacer optimizaciones extensas por adelantado podría "ofuscar" el código de bytes de alguna manera, dificultando que el JIT lo optimice.
No sé lo que hace el compilador de Google cuando traduce el código de bytes de Java al código de Dalvik, podría estar haciendo optimizaciones más extensas.
Tal vez esta herramienta será útil para usted: Dalvik Optimization and Verification With dexopt
Por cierto, el ejemplo que mencionas no siempre es válida; transformar a/4
en a >> 2
no garantiza que su programa se ejecute más rápido en cualquier procesador. Leí un artículo en alguna parte una vez (lo siento, no puedo encontrarlo en este momento ...) que explicaba que en (creo) procesadores x86 modernos, a >> 2
podría ser incluso más lento que a/4
.
En cualquier caso, no haga optimizaciones prematuras como transformar a/4
en a >> 2
a mano en su código fuente a menos que tenga evidencia real (a partir de mediciones de rendimiento) de que vale la pena hacerlo.
La división frente al desplazamiento a la izquierda no tiene ningún efecto en la velocidad general del programa. Ni el más mínimo detalle. – delnan