Optimizaciones de Java: bytecode-only vs JIT
Desarrollando juegos para dispositivos Android, necesito dirigirme a dispositivos que no tienen JIT en absoluto, y solo confío en optimizaciones de bytecode. Me pregunto si el conjunto de estas optimizaciones está vacío o no …
En realidad, ¿el compilador java (el duro, javac, no un JIT) hace cualquier optimización como transformar a / 4 en un >> 2? ¿O es cada optimización un trabajo para el JIT?
- ¿Cuál es la forma óptima de compartir código entre Actividades con diferentes clases base?
- Cómo borrar un JSONArray
- Android LocalServerSocket
- Cómo leer datos del archivo XLS (Excel)
- Cómo leer un flujo de entrada HTTP
- SOAP Envelope Response Error: Error al leer XMLStreamReader
- Obtener el nombre de la ruta absoluta, subcadena de la última barra diagonal, java android
- Eclipse, Eliminar / corregir fácilmente @Override debido al cambio de versión de Java
- Ubicación de Google Play No conectado. Llame a connect () y espere a que onConnected () se llame
- Quitar fragmento de bloqueo
- Anotaciones de JPA en Android
- Eclipse libGDX no se puede ejecutar como aplicación Android
- Descargar un archivo con Android y mostrar el progreso en un ProgressDialog
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 ejecuta 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 que el compilador de Java podría hacer de antemano. Además, hacer amplias optimizaciones de antemano podría "ofuscar" el código de bytes algo, lo que hace más difícil para el JIT para optimizarlo.
No sé lo que hace el compilador de Google cuando traduce su código de bytes Java al código de Dalvik – podría estar haciendo optimizaciones más extensas.
Tal vez esta herramienta será útil para usted: Dalvik Optimización y Verificación Con dexopt
Por cierto, el ejemplo que mencionas no siempre es válido; La transformación de a / 4
en a >> 2
no garantiza que su programa funcione más rápido en cualquier procesador. Leí un artículo en alguna parte (lo siento, no puedo encontrarlo ahora …) que explicó que en (creo) modernos procesadores x86, a >> 2
podría incluso ser más lento que a / 4
.
En cualquier caso, no hagas optimizaciones prematuras como transformar a / 4
a a >> 2
manualmente en tu código fuente a menos que tengas pruebas reales (de medidas de rendimiento) que vale la pena hacerlo.
Si su plataforma de ejecución está realmente ejecutando bytecodes, sus intuiciones sobre cosas como a / 4
son más rápidas que a >> 2
pueden estar equivocadas. Es necesario hacer un perfil de aplicación serio para averiguar:
- Si vale la pena optimizar en absoluto,
- Donde enfocar sus esfuerzos, y
- Qué (micro-) optimizaciones funcionan realmente.
FWIW, es poco probable que el compilador javac
intente micro-optimizar la aritmética. 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.
- ¿Cómo se inicia una Actividad con AlarmManager en Android?
- SetProgressBarIndeterminateVisibility falta de comprensión