2009-04-29 12 views
6

No¿Debo ver el bytecode producido por un compilador Java?

  • El compilador JIT puede "transformar" el código de bytes en algo completamente diferente de todos modos.
  • Lo llevará a hacer una optimización prematura.

Yes

  • Usted no sabe qué método será compilado por el compilador JIT, por lo que es mejor si todos ellos optimizar.
  • Te convertirá en un mejor programador de Java.

Pregunto sin realmente saber (obviamente) así que siéntete libre de redirigir a los hipervínculos JIT.

Respuesta

17

Sí, pero hasta cierto punto, es una buena oportunidad educativa para ver lo que sucede bajo el capó, pero probablemente debería hacerse con moderación.

Puede ser algo bueno, ya que mirar el bytecode puede ayudar a entender cómo se compilará el código fuente de Java en bytecode de Java. Además, puede brindar algunas ideas sobre qué tipo de optimizaciones realizará el compilador y, quizás, algunas limitaciones sobre la cantidad de optimización que puede realizar el compilador.

Por ejemplo, si se realiza una concatenación de cadenas, javac optimizará la concatenación en el uso de un StringBuilder y la realización de append métodos para concatenar los String s.

Sin embargo, si la concatenación de cadenas se realiza en un bucle, una nueva StringBuilder pueden ser instanciadas en cada iteración, lo que lleva a una posible degradación del rendimiento en comparación con instanciar manualmente un StringBuilder fuera del bucle y sólo realizar append s dentro del bucle.

Sobre el tema del JIT. La compilación just-in-time va a ser específica de la implementación de JVM, por lo que no es muy fácil averiguar qué está sucediendo realmente con el bytecode cuando se está convirtiendo al código nativo, y además, no podemos decir qué partes están siendo JITted (al menos no sin algunas herramientas específicas de JVM para ver qué tipo de compilación JIT se está realizando - No conozco ningún detalle en esta área, así que solo estoy especulando).

Dicho esto, la JVM va a ejecutar el bytecode de todos modos, la forma en que se ejecuta es más o menos opaca para el desarrollador, y de nuevo, específica de JVM. Puede haber algunos trucos de rendimiento que realiza una JVM mientras que otro no.

Cuando se trata del tema de mirar el bytecode generado, todo se reduce a aprender lo que realmente está sucediendo con el código fuente cuando se compila en bytecode. Poder ver los tipos de optimizaciones realizadas por el compilador, pero también comprender que existen límites en la forma en que el compilador puede realizar optimizaciones.

Dicho todo esto, no creo que sea una buena idea obsesionarse con la generación de códigos de bytes y tratar de escribir programas que emitan el bytecode más optimizado. Lo que es más importante es escribir código fuente de Java legible y mantenible por otros.

4

Eso depende completamente de lo que estás tratando de hacer. Si está tratando de optimizar un método/módulo, mirar el código de bytes va a ser una pérdida de tiempo. Siempre haga primero un perfil para encontrar dónde están sus cuellos de botella, luego optimice los cuellos de botella. Si su cuello de botella parece tan ajustado como sea posible y necesita hacerlo más rápido, puede que no tenga más remedio que volver a escribirlo en un código nativo e interactuar con JNI.

Intentar optimizar el bytecode generado será de poca ayuda, ya que el compilador JIT hará un montón de trabajo, y no tendrá una idea muy clara de lo que está haciendo.

1

No lo creo. Sin tener que depurar el compilador javac o querer saber como una cuestión de interés, no puedo pensar en una buena razón por la que a alguien le importe qué bytecode se genera.

Conocer bytecode no lo convertirá en un mejor programador de Java más que conocer cómo funciona un motor de combustión interna que lo convertirá en un mejor controlador.

Piense en términos de abstracciones. No es necesario que conozca las acciones de quarks o átomos cuando intenta calcular las órbitas de los planetas. Para ser un buen programador de Java, probablemente deberías aprender ... um ... Java. Sí, Java, eso es todo :-)

+0

Pero Cole Trickle se convirtió en un mejor conductor una vez que se enteró de las partes internas del automóvil. – Boune

0

A menos que esté desarrollando un servidor de alta capacidad de algún tipo, es probable que nunca necesite examinar el bytecode, excepto por curiosidad. El código fuente que se adhiere a las prácticas de codificación aceptables en su organización proporcionará un amplio rendimiento para la mayoría de las aplicaciones.

No se preocupe por el rendimiento hasta que haya encontrado problemas después de la prueba de carga de su aplicación (o toda la fuerza de servicio al cliente lo linchará por esa pantalla que tarda "para siempre" en cargarse). Luego, martillee los cuellos de botella y deje el resto del código solo.

Bytecode requiere una curva de aprendizaje modesta para comprender. Claro, nunca está de más aprender, pero el pragmatismo sugiere posponerlo hasta que sea necesario. (Y en caso de que llegue ese momento, recomiendo buscar a alguien para que lo asesore.)

+0

Examinar el bytecode rara vez le informará sobre el rendimiento. (Excepción de que javac está haciendo algo de alto nivel - concatenación de cadenas y boxeo). –

Cuestiones relacionadas