2011-01-27 9 views
6

Desarrollando juegos para dispositivos Android, necesito apuntar a dispositivos que no tienen JIT en absoluto, y solo confío en las optimizaciones de bytecode. Me pregunto si el conjunto de estas optimizaciones está vacío o no ...Optimizaciones Java: solo bytecode contra JIT

En realidad, ¿el compilador de Java (el duro, javac, no un JIT) realiza alguna optimización, como transformar un/4 en a >> 2? ¿O cada optimización es un trabajo para el JIT?

+0

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

Respuesta

7

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.

+0

Gracias (ambos). Realmente no estoy haciendo ninguna micro-optimización, me gusta la facilidad de lectura, pero me preguntaba si los dispositivos sin JIT sufrirían todos los pecados posibles o si el compilador realizó optimizaciones triviales. Como mencionaste, mi ejemplo no es tan trivial ... fue malo. –

2

Si su plataforma de ejecución está realmente ejecutando bytecodes, es probable que sus intuiciones sobre cosas como a/4 que son más rápidas que a >> 2 sean incorrectas. Es necesario hacer un poco de perfiles de aplicación seria de averiguar:

  • si se trata de optimización que vale la pena en absoluto,
  • dónde enfocar sus esfuerzos, y
  • lo (micro) optimizaciones trabajan realmente.

Fwiw, la javac compilador es poco probable que intente aritmética micro-Optimizar. El código nativo óptimo depende del hardware de la plataforma de ejecución real, y si javac intentó optimizar los bytecodes, es probable que dificulte la tarea del compilador JIT.

Cuestiones relacionadas