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?

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.

  • Android Thread.start () CalledFromWrongThreadException
  • Cómo obtener valor almacenado en ArrayList <HashMap <clave, valor >>?
  • Wrappable TextView con SpannableStringBuilder y ImageSpan esconde la última imagen en cada línea
  • Android: pesadas operaciones de DB con diálogo de progreso
  • Android bloqueo en el curriculum vitae. ¿Cómo interpretar esta excepción?
  • ¿Por qué tantas clases internas en Android?
  • Universal Image Loader para archivos de almacenamiento externo
  • Control de la cámara dentro de una aplicación de Android
  • Android Facebook SDK 4.X, cómo obtener la dirección de correo electrónico y la clave de acceso de Facebook para pasarla al servicio Web
  • Android PhoneGap Plugin, UI tabbar, redimensionar WebView
  • ¿Cómo comprobar FileLock sin truncar el archivo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.